我有一个列record_datetime
的表,曾经是VARCHAR
。我尝试将它更改为DateTime,因为它应该是,但查询花了更多的时间[几乎10倍]。为什么会放慢速度?
此表有近1亿行,record_datetime
是索引。我试图运行的测试查询是
SELECT *
FROM table1
WHERE `record_datetime` >= '2012-06-12 00:00:00'
AND `Source` = 6
ORDER BY `redord_datetime`
Source
是PRIMARY KEY
的一部分,它是user_id,record_datetime和Source的组合。 record_datetime
是唯一的索引。
这是EXPLAIN所说的:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t0 ALL Date NULL NULL NULL 77489783 Using where
由于
答案 0 :(得分:1)
EXPLAIN显示type
列是“ALL”,这意味着它正在扫描整个表,它不使用主键或任何索引来帮助。
它不能使用主键索引,因为您只搜索第2列和第3列。要获取索引以获取帮助,您需要将搜索列作为索引的最左侧列。您还应该在范围比较中涉及的列的左侧列出相等比较中涉及的列。
所以你需要一个索引(Source,Record_datetime)。
当索引没有足够的帮助时,MySQL也会试图避免使用索引,并且只是不必要的开销。例如,如果您要搜索的特定日期范围(> ='2012-06-12')是该表的大部分,则它会回退到“ALL”(表扫描)。如果您的其他条件Source = 6会显着减少匹配的行,那么在索引中的Record_datetime列之前列出列将会有很大帮助。