主键的MAX和MIN值

时间:2015-01-29 09:03:08

标签: mysql performance where

我有一个这样的查询来查找主键的最大/最小值,它满足where条件。

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创建了索引。但是对性能没有任何影响。

2 个答案:

答案 0 :(得分:0)

在插入和删除后创建触发器是一种可能的解决方案,并维护一个两行表来存储主键的最大值,最小值。

答案 1 :(得分:-1)

你能尝试这个吗?     SELECT MIN(id),MAX(id)FROM mytable WHERE date_created&gt; ='2015-01-27 00:00:00'AND created_at&lt; ='2015-01-27 23:59:59