2016-01-03 70 views
0

对于包含两个非空列的表:id (primary)date (indexed),我在mysql-slow日志中获得以下条目。最大索引(列2)

# 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

您有按日期,ID或ID,日期索引。以及id <896173多少行? – scaisEdge

+0

我有按日期,编号索引。有616021行ID <896173。 – mossaab

回答

1

引擎需要查看所有行,其中id<896173并从中选择max(date)。有一个索引在日期和索引ID没有真正的帮助。 MySQL可以使用date上的索引来标识只有一部分行。

但是,该子集足够大,以至于读取所有行(具有顺序访问)比读取仅子集(具有随机访问)更快。

1

我建议你使用一个索引更具选择性喜欢你

use an index based on id, date 

这样的逆ID驱动选择和日期fiels支持选择。