【问题标题】:Analyzing/FIxing Index on large MySql Table分析/修复大型 MySql 表上的索引
【发布时间】: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),删除了所有索引并创建了新索引。从旧表插入新表,并将对其进行测试并报告。

标签: mysql indexing


【解决方案1】:

哎哟!不要重置AUTO_INCREMENT

您是否同时拥有UNIQUE(Company,Address,City,State)UNIQUE(Company,City,State)?第一个不需要是UNIQUE

你有INDEX(Company)吗?这是不必要的,因为该列还有另外两个索引。

你确定同一个城市不能有两家同名的公司吗?

Select count(*) from Companies group by Company 毫无意义。您的意思是计算每个公司出现的次数:Select Company, count(*) from Companies group by Company?或者您的意思是计算行数:Select count(*) from Companies

无论您打算运行哪个,都需要时间来遍历表或索引中的 6300 万条记录。

表是 InnoDB 吗?

请提供SHOW CREATE TABLE

innodb_buffer_pool_size 的值是多少?它应该设置为 可用 RAM 的 70% 左右。

如果有 63M 行,但 AUTO_INCREMENT 的值只有 10M 左右,那就是严重错误。

请同时提供SHOW TABLE STATUS

【讨论】:

    猜你喜欢
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 2019-02-10
    • 2022-12-31
    • 1970-01-01
    • 2015-08-13
    相关资源
    最近更新 更多