MySql为什么选错了索引

案例

线上环境,mysql,`选错索引`sql执行超过20分钟,导致cpu飙升到95%

解决

强制走正确索引-------并非最佳选择
select * from table_name force index(index_name)

复盘

1.mysql是如何选择索引的

  1. 扫描行数是影响执行代价的因素之一。扫描的行数越少,意味着访问磁盘数据的次数越少,消耗的 CPU 资源越少,explain 可以看到mysql预估的扫描航速 rows
  2. 索引统计值 ,也叫索引区分度,是mysql的一个预估值,可以用show index form table_name查看;这个统计值是根据通过采样来计算,取N个数据页算出平均值在乘上页数来回去,全盘扫描代价大所以使用采样统计
  3. 是否使用临时表
  4. 是否排序
  5. 等等因素很多,其他还在总结学习中

2.解决方案有哪些

  1. analyze table 重新统计索引信息,不能百分百解决选错索引问题,因为还有其他因素
  2. force index 来强行指定索引 弊端:一来这么写不优美,二来如果索引改了名字,这个语句也得改,显得很麻烦。而且如果以后迁移到别的数据库的话,这个语法还可能会不兼容。
  3. 通过修改语句来引导优化器,例如 排序根据索引字段来,
  4. 增加或者删除索引来绕过这个问题

3.生产环境上,经过业务确认删除无用索引,建立新的联合索引

本次最终解决方案

删除无用索引

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值