《MySQL——选错索引,该如何做》

如果不断地删除历史数据和新增数据,MySQL有时会选错索引。
选择索引是优化器的工作,优化器优化时会考虑的因素:扫描行数、是否需要排序、是否使用临时表
MySQL通过统计索引上的基数,作为索引的区分度。
统计方法时采样统计,InnoDB默认选择N个数据页,统计这些页面上的不同值,得到一个平均值
然后乘以这个索引的页面数,就得到了这个索引的基数。
举例:
取n = 3个数据页统计,假设共有10个索引数据页
page1:10个不同值
page2: 20个不同值
page3: 15个不同值
索引基数:(10+20+15)/3 * 10 = 150;

如果发现explain的结果预计的rows值和实际情况相差较大,可以使用analyze table t命令恢复,重新统计索引信息

当索引选择出现问题
方法一:采用force index 强行选择一个索引
select * from t force index(a) where a between 1 and 1000 and b between 5000 and 10000 order by b limit 1;
(如果优化器没有选择正确的索引,force index 就对其矫正)
开发的时候不会先写上force index,等到出现问题时再去修改语句
方法二:修改语句,引导MySQL使用我们期望的索引
方法三:在一些场景下,新建一个更加合适的索引,来提供给优化器做选择,或者删除掉误用的索引

猜你喜欢

转载自blog.csdn.net/qq_42604176/article/details/115381296