У меня есть такой запрос для поиска значений max/min первичного ключа, которые удовлетворяют условию where.Значения MAX и MIN первичного ключа
SELECT id
FROM mytable
WHERE date_created >= '2015-01-27 00:00:00'
AND date_created <= '2015-01-27 23:59:59'
LIMIT 1
и EXPLAIN
+----+-------------+------------------------+------+---------------+------+---------+------+----------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------------------+------+---------------+------+---------+------+----------+-------------+
| 1 | SIMPLE | mytable | ALL | NULL | NULL | NULL | NULL | 44726469 | Using where |
+----+-------------+------------------------+------+---------------+------+---------+------+----------+-------------+
и максимум,
SELECT id
FROM mytable
WHERE date_created >= '2015-01-27 00:00:00'
AND date_created <= '2015-01-27 23:59:59'
ORDER BY id DESC
LIMIT 1
и EXPLAIN даст
+----+-------------+------------------------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------------------+-------+---------------+---------+---------+------+------+-------------+
| 1 | SIMPLE | mytable | index | NULL | PRIMARY | 4 | NULL | 1 | Using where |
+----+-------------+------------------------+-------+---------------+---------+---------+------+------+-------------+
Как я бегу эти запросы к очень большой таблице, запрос получает тайм-аут , Есть ли альтернативный метод для поиска этих значений?
ID - это первичный ключ, и я уже создал индекс для date_created. Но это не влияет на производительность.
«Поскольку я запускаю эти очереди против очень большой таблицы, запрос получает тайм-аут» --- mysql не запрашивает тайм-аут - он запускает их независимо от того, насколько они ужасны. – zerkms
Теперь цели: 1. вы пропустили 'ORDER BY' в первом запросе 2. Вы не предоставили' EXPLAIN' и фактическую 'CREATE TABLE' – zerkms
. Вы выбираете с двумя колонками в своем предложении' where' - 'date_created' и 'created_at'. Таким образом, вы должны хотя бы сделать один индекс, который охватывает BOTH эти столбцы, а не только 'date_created'. Это может не полностью решить вашу проблему, но должно стать шагом к повышению производительности. И поскольку вам нужно только «id», вы даже можете сделать индекс с тремя столбцами ('date_created',' created_at' и 'id'), чтобы запрос мог использовать только индекс для получения значений, без необходимости даже читать файл данных. –