将列从VARCHAR转换为DATETIME后,为什么查询运行较慢

时间:2013-06-13 21:53:58

标签: mysql datetime indexing

我有一个列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`

SourcePRIMARY 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

由于

1 个答案:

答案 0 :(得分:1)

EXPLAIN显示type列是“ALL”,这意味着它正在扫描整个表,它不使用主键或任何索引来帮助。

它不能使用主键索引,因为您只搜索第2列和第3列。要获取索引以获取帮助,您需要将搜索列作为索引的最左侧列。您还应该在范围比较中涉及的列的左侧列出相等比较中涉及的列。

所以你需要一个索引(Source,Record_datetime)。

当索引没有足够的帮助时,MySQL也会试图避免使用索引,并且只是不必要的开销。例如,如果您要搜索的特定日期范围(> ='2012-06-12')是该表的大部分,则它会回退到“ALL”(表扫描)。如果您的其他条件Source = 6会显着减少匹配的行,那么在索引中的Record_datetime列之前列出列将会有很大帮助。