Тикеты - оптимизация

Feb 17, 2009 11:43

Исходный 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

Биллинг, sql

Previous post Next post
Up