Я просто позволил медленный журнал (+ не с помощью индексов), и я получаю сотни записей для того же вида запроса (только user
изменения)MySQL не использует индексы
SELECT id
, name
FROM `all`
WHERE id NOT IN(SELECT id
FROM `picks`
WHERE user=999)
ORDER BY name ASC;
EXPLAIN дает:
+----+--------------------+-------------------+-------+------------------+--------+---------+------------+------+------------------------------------------+
| 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 |
+----+--------------------+-------------------+-------+------------------+--------+---------+------------+------+------------------------------------------+
Есть идеи по оптимизации этого запроса? Я пробовал с кучей разных индексов на разных полях, но ничего.
Это получит все выборы, принадлежащие любому пользователю, кроме 999, правильно? Что делает запрос (но не эффективным образом), получает список «доступных» вариантов, но удаляет те, которые уже выбраны пользователем. –
Этот запрос ничего не возвращает для строк, у которых нет соответствующей записи в 'picks', в то время как исходный запрос будет. –
достаточно просто исправить, просто внешнее соединение. – northpole