【发布时间】:2016-06-20 14:16:49
【问题描述】:
我在包含 6300 万条记录 Company、City 和 State 的 Company Table 上有独立的索引,但也有一个名为 Company_NA 的复合索引,它由 Company、City、State 组成。
当我这样做时出于某种原因
Select Count(*) from Companies group by COMPANY,CITY,STATE
解释不选择任何索引
如果我这样做
Select Count(*) from Companies Force Index (COMPANY_NA) group by COMPANY,CITY,STATE
它自然会使用该键,但查询需要很长时间,我在 5 分钟后停止了它。
有没有更好的方法来建立索引,分析索引或要检查的东西,以了解为什么这么慢(除非这与给定表大小一样好)
值得一提的是,有 51 个独特的州,7k 个独特的城市。我无法获得关于 Companies 的唯一计数,因为当我运行时
Select count(*) from Companies group by Company
我不得不在 15 分钟后终止查询。我确实检查了上述查询的解释,它使用公司索引作为键:
- 选择类型:简单
- 表:公司
- 类型:索引
- 可能的键:''
- 密钥:公司
- Key Len:153(不知道为什么,varchar 是 50)
- 参考:''
- 行数:6235080
- 额外:使用索引
更新:
我创建了一个重复的空表,然后从中删除了无关字段和所有索引,然后添加回三个索引:
- 唯一性:公司、地址、城市、州
- UniqueCity:公司、城市、州
- 公司:公司
我也跑了
Alter Table Company Auto_Increment=1
由于正在进行的工作,我的自动增量已超过 10,000,000。
继续测试
【问题讨论】:
-
这里有一个小提琴sqlfiddle.com/#!9/8e1645/1,所以你可以看到mysql默认使用索引
COMPANY_NA。所以告诉我你的表模式来证明你在你的帖子中描述的内容。如果您提供有数千条记录的小提琴,那将是完美的 -
@Alex 现在我复制了表(空),删除了无关字段,尽可能减少了类型大小(例如,varchar 从 255 到 50),删除了所有索引并创建了新索引。从旧表插入新表,并将对其进行测试并报告。