MySQL 5.7
SELECT vk_user_id, COUNT(1) AS score FROM vk_scores WHERE page_id IN (SELECT page_id FROM blitz_tasks WHERE stage = 1533) GROUP BY vk_user_id
EXPLAIN:
1 SIMPLE blitz_tasks NULL ref page_id,stage,stage_index stage_index 4 const 193 100.00 Using temporary; Using filesort
1 SIMPLE vk_scores NULL ref vk_user_id_2,vk_user_id,page_id page_id 4 blitz_tasks.page_id 179 100.00 NULL
Индексы есть на все подряд, собственно, EXPLAIN их показывает.
Внутренний подзапрос к blitz_tasks выпоняется за 8 миллисекунд, и там меньше 200 результатов.
В таблице vk_scores под миллион записей, но всего 4 поля, запрос выдает 600 результатов.
НАД ЧЕМ тут думать 4 секунды?
И какого "Using temporary; Using filesort" при выборке по индексу?
EXPLAIN самого подзапроса, естественно, ничего такого не показывает.
Запросы с IN и JOIN тех же таблиц инвариантны, один и тот же план.
P.S. Проблема появилась с переездом на новый сервер, до того все было пучком, и на сервере разработки тот же запрос на тех же данных с тем же планом отрабатывает за
0,04 секунды.
P.P.S. Таблицы:
CREATE TABLE `blitz_tasks` (
`page_id` int NOT NULL,
`stage` int NOT NULL,
`start` datetime NOT NULL,
`end` datetime NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb3;
ALTER TABLE `blitz_tasks`
ADD UNIQUE KEY `page_id` (`page_id`),
ADD KEY `stage` (`stage`,`start`),
ADD KEY `stage_index` (`stage`);
CREATE TABLE `vk_scores` (
`id` int NOT NULL,
`vk_user_id` decimal(15,0) NOT NULL,
`page_id` int NOT NULL,
`kk_user_id` int NOT NULL DEFAULT '0'
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb3;
ALTER TABLE `vk_scores`
ADD PRIMARY KEY (`id`),
ADD KEY `vk_user_id` (`vk_user_id`),
ADD KEY `page_id` (`page_id`);
ALTER TABLE `vk_scores`
MODIFY `id` int NOT NULL AUTO_INCREMENT;