У меня есть следующие таблицы и запроса в MySQL:ограничение на группы по столбцу
CREATE TABLE IF NOT EXISTS `events` (
`pv_name` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL,
`time_stamp` bigint(20) unsigned NOT NULL,
`event_type` varchar(40) COLLATE utf8mb4_unicode_ci NOT NULL,
`data` json,
PRIMARY KEY (`pv_name`,`time_stamp`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=COMPRESSED;
CREATE TEMPORARY TABLE matching_pv_names (
pv_name varchar(60) NOT NULL,
PRIMARY KEY (pv_name)
) ENGINE=Memory;
SELECT events.pv_name, MAX(events.time_stamp) AS time_stamp
FROM events
WHERE events.time_stamp <= @time_stamp_in
GROUP BY events.pv_name;
Запрос, как он стоит работает эффективно с "Использование индекса для группы-по. Можно ли изменить его, чтобы ограничить набор групп pv_names, которые он группирует, для групп в таблице matching_pv_names
и по-прежнему поддерживать оптимизацию «Использование индекса для групповой»? Например, следующий запрос больше не использует эту оптимизацию:
SELECT events.pv_name, MAX(events.time_stamp) AS time_stamp
FROM events
WHERE events.time_stamp <= @time_stamp_in
AND events.pv_name IN (SELECT matching_pv_names.pv_name FROM matching_pv_names)
GROUP BY events.pv_name;
Есть ли другой способ написать его так, чтобы он это сделал?
Я думаю, что вы правы. Я надеялся, что может быть работа вокруг, потому что я могу добавить 'WHERE events.pv_name LIKE' в запрос и сохранить оптимизацию. – Patrick
Вы не должны стремиться к определенной оптимизации, а скорее стремиться к «лучшей» оптимизации. –
Я считаю, что это лучшая оптимизация, как по документации, так и при тестировании в моем наборе данных. – Patrick