首页 > 数据库 >10 | MySQL为什么有时候会选错索引?

10 | MySQL为什么有时候会选错索引?

时间:2023-06-28 23:58:24浏览次数:41  
标签:选错 10 选择 索引 MySQL 区分度 统计

以下内容出自《MySQL 实战 45 讲》

10 | MySQL为什么有时候会选错索引?

优化器的逻辑

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

影响优化器选择的判断标准:

  • 扫描行数
  • 临时表
  • 是否排序

扫描行数

MySQL 在真正执行语句之前,会根据统计信息来估算记录数。这个统计信息就是索引的 “区分度“。显然,索引上不同的值越多,索引的区分度就越好

索引上不同值的个数,称之为 “基数”。即基数越大,索引区分度越好

MySQL 是怎么得到索引的基数呢? 答案是采样统计,因为精确统计代价太高了。

采样统计的计算方式:InnoDB 默认选择 N 个数据页,统计这些页面上的不同值,得到一个平均值,再乘以这个索引的页面数,就得到了这个索引的基数。

当数据表占用变更的数据行数超过 1/M 的时候,会自动触发重新做一次索引统计。

MySQL 中,有两种存储索引统计的方式,通过设置参数 innodb_stats_persistent 来选择:

  • 设置为 ON(默认): 表示统计信息会持久化存储,此时,默认的 N 是 20,M 是 10。
  • 设置为 OFF: 表示统计信息只存储在内存中。此时,默认的 N 是 8,M 是 16。

由于索引统计信息不准确导致的问题,可以用 analyze table table_name 来重新统计索引信息。

在实践中,如果你发现 explain 的结果预估的 rows 值跟实际情况差距比较大,可以采用这个方法来处理。

索引选择异常和处理

大多数情况下,优化器都能找到正确的索引,但是当优化器选择索引不正确时,应该怎么办?

  • 采用 force index 强行选择一个索引。(不优雅)
  • 修改语句,引导 MySQL 使用我们期望的索引。
  • 新建一个更合适的索引或删掉误用的索引。

标签:选错,10,选择,索引,MySQL,区分度,统计
From: https://www.cnblogs.com/sun-yanglu/p/17512858.html

相关文章

  • ligntOj 1038(期望)
    题意:给出一个n,一步操作是让n除n的一个随机因子得到新的n,问可以得到新的n是1的步数期望。题解:因为n/1=n这种选择会造成循环,所以需要用到递推,令n变成1的步数期望是f[n],比如n是2,f[2]=1/2(f[2]+1)+1/2(f[1]+1),加1是因为2变成2也需要一步,那么移项后,f[2]=2+f[1]=2+0=......
  • Docker实战_Mysql数据卷挂载
    Docker实战_Mysql数据卷挂载搜索镜像dockersearchmysql:5.7下载镜像dockerpullmysql:5.7运行镜像dockerrun-d-p3306:3306\-v/opt/mysql/conf:/etc/mysql/conf.d\-v/opt/mysql/data:/var/lib/mysql\-eMYSQL_ROOT_PASSWORD=123456--namemy-mysqlmysql:......
  • 10redis列表操作,其他操作,redis管道,django中使用redis,django缓存,序列化json和pickle,cel
    字符串和字节转换的两种方式#字符串和字节转换的两种方式 -decode,encode-直接类型转换-bytes格式的16进制,2进制,10进制的显示#字符串需要用encode,bytes格式需要用decode,但是有时候忘了#可以直接进行强转b1=bytes(s,encoding='utf-8') print(......
  • Mysql
    下载:官网:http://dev.mysql.com/downloads/mysql/安装教程:https://blog.csdn.net/weixin_39289696/article/details/128850498Mysql目录介绍:#binmysql.exe#这个是mysql自带的客户端mysqld.exe#这个是mysql的服务端#data'''它......
  • Mysql 日期和时间转换
    https://www.php.cn/faq/523569.html一、MySQL中的日期时间类型在MySQL中,日期时间类型包括DATE、TIME、DATETIME以及TIMESTAMP四种类型。其中,DATE类型表示日期,格式为'YYYY-MM-DD';TIME类型表示时间,格式为'HH:MM:SS';DATETIME类型表示日期和时间,格式为'YYYY-MM-DDHH:MM:SS';TIMESTA......
  • CF Gym 102994 Travel Dream
    题意求一张带权无向图中最大的\(k\)元简单环,无解输出impossible。\(1\len,m\le300,k\le10\)。注意\(k\)的范围题解\(k\)很小,存在简单办法对小环小链进行预处理,考虑折半。首先考虑怎么求长度小于等于4的链。长度为\(1,2\)的链可以直接枚举,长度为\(3\)的链......
  • 1、MySQL操作命令学习1
    一、对数据库及表的基础操作1、连接数据库服务器                   mysql-hlocalhost-uroot-p1234562、2.退出服务器                           exit3、查看所有的数据库                  ......
  • mysql随笔
    备份exchangedb库下的systemtable表mysqldump--defaults-extra-file=/etc/my_pass.txt--flush-logs--single-transaction--set-gtid-purged=OFFexchangedbsystemtable>/data/system_config.sql查看binlog执行的具体操作/usr/bin/mysqlbinlog--no-defaults-v-v--bas......
  • 7-010-(LeetCode- 518) 零钱兑换II
    1.题目读题518.零钱兑换II给你一个整数数组coins表示不同面额的硬币,另给一个整数amount表示总金额。请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回0。假设每一种面额的硬币有无限个。题目数据保证结果符合32位带符号整数。......
  • uva 10034(最小生成树)
    题目:InanepisodeoftheDickVanDykeshow,littleRichieconnectsthefrecklesonhisDad'sbacktoformapictureoftheLibertyBell.Alas,oneofthefrecklesturnsouttobeascar,sohisRipley'sengagementfallsthrough.ConsiderDick......