对于包含两个非空列的表:id (primary)
和date (indexed)
,我在mysql-slow日志中得到以下条目。
# Query_time: 16.316747 Lock_time: 0.000049 Rows_sent: 1 Rows_examined: 616021
SET timestamp=1451837371;
select max(date) from mytable where id<896173;
我在此查询上运行了EXPLAIN
,这就是结果。
id = 1
select_type = SIMPLE
table = mytable
type = range
possible_keys = PRIMARY
key = PRIMARY
key_len = 4
ref = NULL
rows = 337499
Extra = Using where
我尝试编辑date
索引以向其添加id
列。但是,检查的行数仍然很高。我该怎么做才能减少这个数字?
答案 0 :(得分:1)
引擎需要查看id<896173
的所有行,然后从中选择max(date)
。拥有日期索引和id索引并没有多大帮助。 MySQL可以使用日期索引来仅识别行的子集。
但是,该子集足够大,读取所有行(使用顺序访问)比仅读取子集(使用随机访问)更快。
答案 1 :(得分:1)
我建议您使用更具选择性的索引,例如
的倒数use an index based on id, date
以这种方式,id驱动选择,日期字符支持选择。