MySQL не использует индексы - PullRequest
0 голосов
/ 24 октября 2009

Я только что включил медленный журнал (+ не использую индексы) и получаю сотни записей для одного и того же типа запроса (только user изменения)

SELECT id
     , name 
  FROM `all` 
 WHERE id NOT IN(SELECT id 
                   FROM `picks` 
                  WHERE user=999) 
ORDER BY name ASC;

Объяснение дает:

+----+--------------------+-------------------+-------+------------------+--------+---------+------------+------+------------------------------------------+
| id | select_type        | table             | type  | possible_keys    | key    | key_len | ref        | rows | Extra                                    |
+----+--------------------+-------------------+-------+------------------+--------+---------+------------+------+------------------------------------------+
|  1 | PRIMARY            | all               | index | NULL             | name   | 156     | NULL       |  209 | Using where; Using index; Using filesort | 
|  2 | DEPENDENT SUBQUERY | picks             | ref   | user,user_2,pick | user_2 | 8       | const,func |    1 | Using where; Using index                 | 
+----+--------------------+-------------------+-------+------------------+--------+---------+------------+------+------------------------------------------+

Есть идеи о том, как оптимизировать этот запрос? Я пробовал с кучей разных индексов на разных полях, но ничего.

Ответы [ 3 ]

0 голосов
/ 24 октября 2009

Я не обязательно согласен, что «не в» и «существует» ВСЕГДА плохой выбор производительности, однако, это может быть в этой ситуации.

Вы можете получить результаты, используя гораздо более простой запрос:

SELECT id
     , name 
  FROM `all`
     , 'picks'
 WHERE all.id = picks.id
   AND picks.user <> 999 
ORDER BY name ASC;
0 голосов
/ 24 октября 2009

Это, вероятно, лучший способ написать запрос. Выберите все из all и попробуйте найти подходящие строки из picks, которые имеют одинаковые id, а user - 999. Если такой строки не существует, picks.id будет NULL, потому что она использует левое внешнее соединение. Затем вы можете отфильтровать результаты, чтобы они возвращали только эти строки.

SELECT all.id, all.name 
FROM
    all
    LEFT JOIN picks ON picks.id=all.id AND picks.user=999
WHERE picks.id IS NULL
ORDER BY all.name ASC
0 голосов
/ 24 октября 2009

«не в» и «существует» всегда плохой выбор для производительности. Может быть, оставьте присоединиться к чеку "NULL", лучше попробуйте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...