Исходный sql запрос -
SELECT *, (SELECT count(*) FROM tickets_comment WHERE ticket=tickets.id) as comm FROM tickets
WHERE assigned=5 AND status<>7 AND status<>8 ORDER BY status,dt_change DESC;
Хочется чего-нибудь улучшить. Очевидно, что можно поиграться с условиями WHERE.
Опыты с EXPLAIN SELECT показывают, что замена на `status` IN (1,2,3,4,5,6) ничего совсем не дает. Т.е. абсолютно те же результаты. Замена на `status` < 7 тоже ничего не дала.
Вернее, поле rows сначало было 284, потом 300, а теперь 307, но - для всех абсолютно запросов одинаково. Почему так - не понял.
Похоже, оптимизатор все три варианта сводит к какому-то одному.
upd: А теперь добавляем
KEY `indxWhere` (`assigned`,`status`),
и число rows сокращается до 44. Это мне уже нравится. И для варианта с IN - теперь 38. Для status < 7 - 33. Вот это я понимаю - оптимизация. Правда от Extra == "Using where; Using filesort" пока избавиться не удалось, даже увеличением буфером. Хотя, может не тот буфер увеличил.
upd2:
Итоговый запрос получился такой: (отформатирован для удобства чтения)
SELECT
*
, (SELECT count(*) FROM tickets_comment WHERE ticket=tickets.id) as comm
, (SELECT login FROM users WHERE id=tickets.assigned) as login
FROM tickets
WHERE status < 7 AND assigned=5 ORDER BY status,dt_change DESC;
И, обратите внимание, это лучше, чем альтернатива с JOIN.
upd3:
id
select_type
table
type
possible_keys
key
key_len
ref
rows
Extra
1
PRIMARY
tickets
range
indxAssigned,indxWhere
indxWhere
9
\N
33
Using where; Using filesort
3
DEPENDENT SUBQUERY
users
eq_ref
PRIMARY
PRIMARY
4
kola_bill2.tickets.assigned
1
2
DEPENDENT SUBQUERY
tickets_comment
ref
indxTicket
indxTicket
4
kola_bill2.tickets.id
2
Using index