3

我有一个表,其中有一列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是唯一的索引。

这是解释说的:

   id   select_type table type possible_keys key  key_len ref   rows      Extra
    1   SIMPLE       t0    ALL    Date       NULL   NULL  NULL 77489783  Using where

谢谢

4

1 回答 1

1

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

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

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

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

于 2013-06-13T22:36:30.087 回答