opium
@opium
Просто люблю качественно работать

Какой индекс нужно построить для полей в этом запросе mysql?

Собственно, для таблицы trainingplanner t не используются индексы, одиночные индексы для всех полей уже есть, какой бы тут индекс придумать? Составной индекс для этих двух полей не дает результата t.userid <> t.editor

mysql> explain SELECT t.plan_wko, t.plan_date, t.plan_time, t.plan_distance, t.plan_units, t.plan_notes,
-> u1.email AS 'S', u1.firstname AS 'S', u1.lastname AS 'S',
-> u2.email AS 'S', u2.firstname AS 'S', u2.lastname AS 'S',
-> t.planid
-> FROM trainingplanner t
-> JOIN users u1 ON u1.userid = t.editor
-> JOIN users u2 ON u2.userid = t.userid
-> LEFT OUTER JOIN trainingplanner_emails e ON t.planid = e.id
-> WHERE e.id IS NULL
-> AND t.userid <> t.editor
-> ORDER BY u2.email, u1.email, t.plan_date ASC
-> ;

+----+-------------+-------+--------+-------------------------+---------+---------+-------------------+-------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+-------------------------+---------+---------+-------------------+-------+----------------------------------------------+
| 1 | SIMPLE | t | ALL | userid,editor,userid_2 | NULL | NULL | NULL | 34989 | Using where; Using temporary; Using filesort |
| 1 | SIMPLE | u2 | eq_ref | PRIMARY,userid,userid_2 | PRIMARY | 4 | runzalot.t.userid | 1 | |
| 1 | SIMPLE | u1 | eq_ref | PRIMARY,userid,userid_2 | PRIMARY | 4 | runzalot.t.editor | 1 | |
| 1 | SIMPLE | e | ALL | NULL | NULL | NULL | NULL | 34509 | Using where; Not exists |
+----+-------------+-------+--------+-------------------------+---------+---------+-------------------+-------+---------------------------------
  • Вопрос задан
  • 2623 просмотра
Пригласить эксперта
Ответы на вопрос 2
@pihel
Sql, Oracle, pl/sql, BI, ETL, php, olap
Не силен в mysql планах, но попробую :) :
* LEFT OUTER JOIN - судя по всему заменен на NOT EXISTS, тогда нужны индексы на trainingplanner_emails.id и trainingplanner.planid
Попробуйте явно написать not exists, может стоимость уменьшится.
* Создайте индекс на полях по которым сортируете:
u2.email, u1.email, t.plan_date ASC
Возможные изменения логики:
* t.userid <> t.editor - может заменить на одно поле и сделать по нему индекс? В текущей реализации индекс никак не будет использоваться.
* Нет возможность создать обратную таблицу для trainingplanner_emails ? exists (или join) отработал бы гораздо быстрей, чем not exists
Ответ написан
Комментировать
gillbeits
@gillbeits
ALTER TABLE `trainingplanner ` ADD INDEX `eup` (`userid` , `editor`, `planid`);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы