2015-01-29 2 views
0

У меня есть такой запрос для поиска значений 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. Но это не влияет на производительность.

+1

«Поскольку я запускаю эти очереди против очень большой таблицы, запрос получает тайм-аут» --- mysql не запрашивает тайм-аут - он запускает их независимо от того, насколько они ужасны. – zerkms

+0

Теперь цели: 1. вы пропустили 'ORDER BY' в первом запросе 2. Вы не предоставили' EXPLAIN' и фактическую 'CREATE TABLE' – zerkms

+0

. Вы выбираете с двумя колонками в своем предложении' where' - 'date_created' и 'created_at'. Таким образом, вы должны хотя бы сделать один индекс, который охватывает BOTH эти столбцы, а не только 'date_created'. Это может не полностью решить вашу проблему, но должно стать шагом к повышению производительности. И поскольку вам нужно только «id», вы даже можете сделать индекс с тремя столбцами ('date_created',' created_at' и 'id'), чтобы запрос мог использовать только индекс для получения значений, без необходимости даже читать файл данных. –

ответ

0

создание триггера после вставки и удаления является возможным решением и поддерживает таблицу двух строк для хранения максимального, минимального значения для первичного ключа.

+0

Пытаясь оптимизировать такую ​​тривиальную (быструю) операцию, следуя вашим советам в 99% случаев, это беспроигрышный способ – zerkms

-1

вы можете попробовать это
SELECT MIN (ID), MAX (ID) FROM туЬаОго WHERE DATE_CREATED> = '2015-01-27 00:00:00' И created_at < = «2015-01-27 23: 59:59

Смежные вопросы