选择索引是优化器的工作。。。

优化器选择索引的目的,是找到一个最优的执行方案,并用最小的代价去执行语句。通过三个指标进行选择:

  1. 扫描行数
  2. 是否使用临时表
  3. 是否排序

扫描行数是怎么判断的?

MySQL 在真正开始执行语句之前,并不能精确地知道满足这个条件的记录有多少条,而只能根 据统计信息来估算记录数。 这个统计信息就是索引的“区分度”。显然,一个索引上不同的值越多,这个索引的区分度就越 好。而一个索引上不同的值的个数,我们称之为“基数”(cardinality)。也就是说,这个基数 越大,索引的区分度越好。 我们可以使用 show index 方法,看到一个索引的基数。如图 4 所示,就是表 t 的 show index 的结果 。虽然这个表的每一行的三个字段值都是一样的,但是在统计信息中,这三个索引的基 数值并不同,而且其实都不准确。

那么,MySQL 是怎样得到索引的基数的呢?这里,我给你简单介绍一下 MySQL 采样统计的方法。

为什么要采样统计呢?因为把整张表取出来一行行统计,虽然可以得到精确的结果,但是代价太高了,所以只能选择“采样统计”。 采样统计的时候,InnoDB 默认会选择 N 个数据页,统计这些页面上的不同值,得到一个平均值,然后乘以这个索引的页面数,就得到了这个索引的基数。

MySQL为什么有时候会选错索引?相关推荐

  1. MySQL MySQL为什么有时候会选错索引?

    选错索引的案例 server层优化器的逻辑 主要工作 选择索引 扫描行树判断 选错索引的解决方案 索引选择异常和处理

  2. mysql explain 为空_车祸现场!我的MySQL千万级数据表选错索引了!

    最近在线上环境遇到了一次SQL慢查询引发的数据库故障,影响线上业务.经过排查后,确定原因是:SQL在执行时,MySQL优化器选择了错误的索引(不应该说是"错误",而是选择了实际执行 ...

  3. MySQL选错索引导致的线上慢查询事故复盘

    前言 又和大家见面了!又两周过去了,我的云笔记里又多了几篇写了一半的文章草稿.有的是因为质量没有达到预期还准备再加点内容,有的则完全是一个灵感而已,内容完全木有.羡慕很多大佬们,一周能产出五六篇文章, ...

  4. mysql为什么选错索引?怎么解决?

    mysql为什么选错索引? 在进行慢SQL分析的时候,有时候我们会发现explain的扫描行数和慢日志中的行数相差很大,那explain中的rows这个扫描行数是怎么判断的? 其实MySQL在真正开始 ...

  5. 10 mysql选错索引

    10 mysql选错索引 在mysql表中可以支持多个索引,有的sql不指定使用哪个索引,由mysql自己来决定,但是有时候mysql选错了索引,导致执行很慢. 例子 CREATE TABLE `t1 ...

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

    如果不断地删除历史数据和新增数据,MySQL有时会选错索引. 选择索引是优化器的工作,优化器优化时会考虑的因素:扫描行数.是否需要排序.是否使用临时表 MySQL通过统计索引上的基数,作为索引的区分度 ...

  7. mysql选错索引怎么解决_MySQL选错索引的原因以及解决方案

    MySQL 中,可以为某张表指定多个索引,但在语句具体执行时,选用哪个索引是由 MySQL 中执行器确定的.那么执行器选择索引的原则是什么,以及会不会出现选错索引的情况呢? 先看这样一个例子: 创建表 ...

  8. cardinality mysql_Cardinality统计取值不准确导致MYSQL选错索引

    场景简介 SQL明明可以走a索引,却走了慢的b索引? 场景模拟use muke; drop table if exists t13; CREATE TABLE `t13` ( `a` int(11) ...

  9. MySQL优化器选错索引情况

    MySQL优化器选错索引情况 1. 优化器选错索引 2. 优化器的逻辑 3. 索引选择异常和处理 1. 优化器选错索引 之前MySQL架构以及执行sql查询语句介绍过MySQL优化器可以帮助我们优化s ...

最新文章

  1. 新建silverlight项目提示未将对象设置到实例解决方案
  2. 条款02:尽量以const,enum,inline代替#define
  3. GC DevKit 快速入门 -- 游戏概览(三)
  4. Captcha插件后门分析和修复
  5. *【CodeForces - 859C 】Pie Rules (博弈dp,时光倒流)
  6. 数仓如何设置大小写不敏感函数
  7. REHL 6 安装指南
  8. Delphi编译后的程序图标无法修改一例
  9. 针对Android智能电视研发的,基于Android的智能电视遥控系统研制
  10. vp230引脚功能_SN65HVD230:具有待机模式的 3.3V CAN 收发器
  11. C#服务端的微信小游戏——多人在线角色扮演(十二)
  12. 磁盘阵列数据恢复_raid5硬盘离线数据恢复步骤_HP-lefthand存储详解
  13. 在Excel中输入身份证号码的方法或批量改为文本格式
  14. C语言习题:编程序将”China”译成密码[C语言]
  15. CPU与RISC-V ISA架构
  16. Android源码目录结构详解(转载)
  17. vscode插件及配置
  18. nginx 反向代理(完成图片回显示效果)
  19. 大数据学习的有哪些相关书籍
  20. 外汇交易的高风险行为应该如何防范?

热门文章

  1. 惊!空 struct 地址竟然不相等
  2. FloodFill算法详解及应用
  3. LiveVideoStack线上分享第五季(七):开源流媒体服务器:为何一定得再撸个新的...
  4. http 状态码 504 502
  5. RequestMethod的参数的含义是?
  6. 使用dbcp连接池创建进行表的增删改查
  7. leetcode 79. Word Search | 79. 单词搜索(回溯+DFS)
  8. leetcode 268. 丢失的数字(Java版)
  9. 【Redis】新浪微博与微信Redis架构实战 - 笔记
  10. 【PAT甲级 BigDecimal科学计数法转换普通数字】1073 Scientific Notation (20 分) Java开挂解法 全部AC