Также мне было любопытно спросить: может ли иметь смысл создание составного индекса для 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» такой медленный с вложенным запросом и почему такой быстрый со значениями в нем? Я не могу переписать запрос (купил программное обеспечение), поэтому я надеялся, что есть какой-то твик или подсказка для ускорения этого запроса! Любая помощь приветствуется.

Ответы на вопрос(4)

Ваш ответ на вопрос