Также мне было любопытно спросить: может ли иметь смысл создание составного индекса для l.campaignid, l.link и l.id?
я есть запрос MySQL (Ubu 10.04, Innodb, Core i7, 16 ГБ ОЗУ, SSD диски, оптимизированы параметры MySQL):
SELECT
COUNT(DISTINCT subscriberid)
FROM
em_link_data
WHERE
linkid in (SELECT l.id FROM em_link l WHERE l.campaignid = '2900' AND l.link != 'open')
Таблица em_link_data имеет около 7 миллионов строк, em_link - несколько тысяч. Этот запрос займет около18 секунд завершить. Однако, если я подставлю результаты подзапроса и сделаю это:
SELECT
COUNT(DISTINCT subscriberid)
FROM
em_link_data
WHERE
linkid in (24899,24900,24901,24902);
тогда запрос будет выполнен менее чем за 1 миллисекунду. Один подзапрос выполняется менее чем за 1 мс, столбец linkid индексируется.
Если я переписать запрос как объединение, также менее 1 мс. Почему запрос «IN» такой медленный с вложенным запросом и почему такой быстрый со значениями в нем? Я не могу переписать запрос (купил программное обеспечение), поэтому я надеялся, что есть какой-то твик или подсказка для ускорения этого запроса! Любая помощь приветствуется.