【发布时间】:2014-12-16 05:06:28
【问题描述】:
我在 MySQL 中有一个包含 50 多列的 InnoDB 表。表中有超过 500000 行。我只使用 DATETIME 列 (dt) 和 VARCHAR(245) 列 (code) 进行搜索。我为两列都创建了索引。
下面的查询很快:
SELECT COUNT(*) FROM TABLE WHERE `code` IN ('name1', 'name2') LIMIT 0,1000
这也很快:
SELECT COUNT(*) FROM TABLE WHERE `dt` BETWEEN '2014-01-01' AND '2014-12-01' LIMIT 0,1000
但将两者结合起来需要几分钟:
SELECT COUNT(*) FROM TABLE WHERE `code` IN ('name1', 'name2') AND `dt` BETWEEN '2014-01-01' AND '2014-12-01' LIMIT 0,1000
有人能解释一下为什么最后一个查询需要很长时间,而前两个查询非常快吗?
最后一个查询的解释输出是:
Select type: Simple
Type: Range
possible keys: dt_index, code_index
key: ts_index
【问题讨论】:
-
您有 2 个单独的索引还是一个组合索引?
explain select ...输出是什么? -
两个独立的索引。这是解释输出:选择类型:简单类型:范围可能的键:dt_index,code_index键:ts_index
-
请将输出添加到问题中
-
创建包含两列的复合索引。
-
做到了!创建复合索引解决了这个问题。
标签: mysql