6.MySQL出现选错索引的情况

一. 设置MySQL慢查询日志输出
set long_query_time = 0; -- 开启慢查询日志记录
select * from t force index(a) where a between 10000 and 20000; -- 强制走索引
二. 出现选错索引的情况
  1. 因为估算扫描行数付出的代价选错索引
    优化器的逻辑:优化器选择索引的目的,是找到一个最优的执行方案,并用最小的代价去执行语句。
    **估算扫描行数:**索引的区分度,一个索引上的不同值越多,这个索引的区分度就越好。而一个索引上不同的值的个数称之为基数,这个基数越大索引的区分度越好。 优化器采用的是采样统计。 表中数据删增幅度比较大优化器中统计的索引信息的rows未及时刷新,优化器认为走索引执行回表的代价要比直接进行全表扫描代价大。使用:anaylyze table t可以重新统计索引信息。
  2. 因为排序而导致选错索引。
mysql> select * 
         from t 
         where (a between 1 and 1000)  
         and (b between 50000 and 100000) 
         order by b limit 1;

如果b,a均为索引,并且连续,从上边来看走索引a的扫描行数要少于b,但是以上语句却会走索引b。因为优化器认为使用索引b不需要再做排序,因为索引本身有序,只需要遍历。
做如下优化:

mysql> select * 
           from  (select * 
                       from t 
                       where (a between 1 and 1000)  
                       and (b between 50000 and 100000) order by b limit 100) alias 
           imit 1;

这就意味这这两个索引都需要排序,因此扫描行数就成为了影响决策的主要条件。于是此时选择了只需要扫描1000行的索引a.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值