У меня есть следующий запрос:Оптимизация запросов MySQL с диапазоном дат и присоединиться к
SELECT COUNT(*)
FROM datum d
JOIN datum_type dt
ON dt.datum_id = d.id
AND dt.type_id = '3'
WHERE d.added_time >= DATE_FORMAT(CURDATE(), '%Y-%m')
AND d.added_time < DATE_FORMAT(CURDATE() + INTERVAL 1 MONTH, '%Y-%m')
Есть индексы на d.id (Primary), d.added_time, dt.datum_id и dt.type_id
в настоящее время объяснить план:
+----+-------------+-------+--------+--------------------+---------+---------+-------------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+--------------------+---------+---------+-------------+--------+-------------+
| 1 | SIMPLE | dt | ref | type_id,datum_id | type_id | 1 | const | 602628 | |
| 1 | SIMPLE | d | eq_ref | PRIMARY,added_time | PRIMARY | 8 | dt.datum_id | 1 | Using where |
+----+-------------+-------+--------+--------------------+---------+---------+-------------+--------+-------------+
Как мы имеем базовые элементы записи в течение достаточно долгого времени, то, как представляется, присоединение к типу в первом использовании datum.id ГЛАВНЫЙ, а затем сканируя каждый присоединился ряд, чтобы увидеть, если нулевой точки. Добавлено_time is w в диапазоне.
Я попытался с помощью индекса added_time но план был объяснить:
+----+-------------+-------+-------+------------------+------------+---------+------+---------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+------------------+------------+---------+------+---------+--------------------------+
| 1 | SIMPLE | d | index | added_time | added_time | 4 | NULL | 6195194 | Using where; Using index |
| 1 | SIMPLE | dt | ref | type_id,datum_id | datum_id | 8 | d.id | 1 | Using where |
+----+-------------+-------+-------+------------------+------------+---------+------+---------+--------------------------+
который занимает почти столько же времени, как есть так много datum_types различной datum_type.type_id в диапазоне datum.added_time.
Есть ли какая-то комбинация индекса, которая может ускорить это?
Пробовал ли вы составной ключ (datum_id, type_id)? Я действительно не понимаю бит DATE_FORMAT, но, возможно, он мало влияет на производительность. – Strawberry
Ооо, попробуй указатель. – Arth
Ненужная нормализация 'datum_type'? –