iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >eq_range_index_dive_limit的作用
  • 464
分享到

eq_range_index_dive_limit的作用

2024-04-02 19:04:59 464人浏览 安东尼
摘要

Mysql5.6引入了一个新的系统变量eq_range_index_dive_limit。查阅mysql5.6官方文档得知,Mysql在执行等值范围查询例如select ... from xxx

Mysql5.6引入了一个新的系统变量eq_range_index_dive_limit。
查阅mysql5.6官方文档得知,Mysql在执行等值范围查询例如select ... from xxx where xxx in(...)时,优化器在计算执行计划成本时会根据条件个数采用不同的方式以减小选择执行计划的开销。
当条件数N小于eq_range_index_dive_limit时,优化器认为此时条件个数尚可,可以采用成本较高但更为精确的index dive方式来计算执行成本;当N大于或等于eq_range_index_dive_limit时,优化器会认为此时使用index dive的方式计算成本带来的开销过大,此时MySQL优化器会根据index statistics直接估算成本。
大部分情况下,where条件中使用的索引列的选择性都还是不错的,使用index statistic直接估算返回行数并不会有太大偏差,并且能够避免index dive带来的开销,在IN条件较多的情况下,能快速找到正确的执行计划,提升系统性能。然而,不均匀分布的索引也不罕见,这种情况下,eq_range_index_dive_limit可能会显着影响查询执行计划,这里借用网上的一个案例:

有一个表“t”。主键由从“id1”开始的多个列组成。表t中有1.67M行,id1的基数是46K(这些数字可以通过SHOW TABLE STATUS / SHOW INDEX收集)。因此,每个id1平均有36行(1.67M / 46K = 36),但实际的id1分布是不均匀的。有接近1M行,其中id1在1和10之间。

mysql> explain select count(*)from t force index(PRIMARY)where id1 in(1,2,3,4,5,6,7,8,9)\G 
***************** 1.行********** * 
id:1 
select_type:SIMPLE 
table:t 
type:range 
possible_keys:PRIMARY 
key:PRIMARY 
key_len:8 
ref:NULL 
rows:912388 
extra:using where;using index 
1 row(0.00 sec)

MySQL估计912K行匹配,其中id1 IN(1..9)。这接近实际数字。 MySQL5.6引入了持久化优化器统计,使统计信息更准确。

mysql>explain select count(*)from t force index(PRIMARY)where id1 in(1,2,3,4,5,6,7,8,9,10)\G 
***************** 1.行********** * 
id:1 
select_type:SIMPLE 
table:t 
type:range 
possible_keys:PRIMARY 
key:PRIMARY 
key_len:8 
ref:NULL 
rows:360 
extra:using where;using index 
1 row(0.00 sec)

当添加一个IN条件(id1 IN(1..10))时,突然估计的行数下降到360!这比实际匹配的行数小得多。估计的行数越来越少(或更大)经常使MySQL选择不正确的查询执行计划,所以这是真的很严重。

估计的行数变化很大的原因是一个新的系统变量eq_range_index_dive_limit。如在线手册所述,“如果eq_range_index_dive_limit大于0,如果有eq_range_index_dive_limit或更多相等范围”,优化器将使用现有索引统计信息而不是索引潜水。默认eq_range_index_dive_limit为10.因此,当设置10个或更多IN条件时,MySQL会跳过索引dive,并从统计信息中估计行数。在这个例子中,MySQL估计360行(1.67M(表t的估计总行数)/ 46K(基数id1)* 10(IN条件)== 360)。

通过增加eq_range_index_dive_limit足够大,MySQL不会错误地估计行。

mysql> set session eq_range_index_dive_limit = 1000; 
query OK,0 row affected(0.00秒)

mysql>explain select count(*)from t force index(PRIMARY)where id1 in(1,2,3,4,5,6,7,8,9,10)\G 
***************** 1.行********** * 
id:1 
select_type:SIMPLE 
table:t 
type:range 
possible_keys:PRIMARY 
key:PRIMARY 
key_len:8 
ref:NULL 
rows:937684 
extra:using where;using index 
1 row(0.00 sec)

由于SQL强制走了主键索引,在这个例子中MySQL并没有选错执行计划,但eq_range_index_dive_limit对于MySQL选择执行计划的影响显而易见。
在eq_range_index_dive_limit设置过小且索引分布极不均匀的情况下,MySQL可能会由于成本计算误差太大,导致选择错误的执行计划这一灾难性后果!
如果是业务特征决定了需要执行多次类似于上述案例中的SQL,DBA应考虑关闭该特性:
set global eq_range_index_dive_limit = 0;
总结
eq_range_index_dive_limit有助于减少查询执行计划的index dive成本,但5.6版本缺省值为10,有点偏小,DBA应根据业务特点选择合理的值或者关闭该特性。
注:该参数在MySQL 5.7中缺省值为200。

您可能感兴趣的文档:

--结束END--

本文标题: eq_range_index_dive_limit的作用

本文链接: https://www.lsjlt.com/news/44286.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • eq_range_index_dive_limit的作用
    MySQL5.6引入了一个新的系统变量eq_range_index_dive_limit。查阅MySQL5.6官方文档得知,MySQL在执行等值范围查询例如select ... from xxx ...
    99+
    2022-10-18
  • innodb_support_xa的作用
    innodb_support_xa可以开关InnoDB的xa两段式事务提交。 如何开启? innodb_support_xa=true,支持xa两段式事务提交。 默认为true,值为on,多线程并发执行...
    99+
    2022-10-18
  • key的作用
    not null 与 default create table t1( id int primary key auto_increment, 设置了主键 id,如果通过id查找就会大量减...
    99+
    2022-10-18
  • mysqld.exe的作用
    了解mysqld.exe的作用?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!mysqld.exe是计算机进程,是MySQL...
    99+
    2022-10-18
  • python @的作用
    这只是我的个人理解: 在Python的函数中偶尔会看到函数定义的上一行有@functionName的修饰,当解释器读到@的这样的修饰符之后,会先解析@后的内容,直接就把@下一行的函数或者类作为@后边的函数的参数,然后将返回值赋值...
    99+
    2023-01-31
    作用 python
  • javascript的块级作用域有什么作用
    今天小编给大家分享一下javascript的块级作用域有什么作用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我...
    99+
    2022-10-19
  • aspectjweaver和aspectjrt的作用?(作用、说明、案例)
    AspectJ是一种面向切面编程(AOP)的扩展,它包含了AspectJweaver和AspectJrt两个组件。AspectJwe...
    99+
    2023-09-08
    作用
  • allowMultiQueries=true的作用
    MySQL连接数据库时,添加语句:“allowMultiQueries=true”的作用: 1.可以在sql语句后携带分号,实现多语句执行。 可以执行批处理,同时发出多个SQL语句。 sql语句 ...
    99+
    2023-09-06
    数据库 sql java Powered by 金山文档
  • mysql.help_topic的作用及使用
    今天在查询sql写法时突然出现一个没有接触过的表,mysql.help_topic. 网上也没有给出作用及解释,都是一些使用方法,对于不了解的人会容易蒙圈. 经过长时间的查询后写下这篇文章,希望能帮到大家,错误的地方还请指出. mysql...
    99+
    2023-09-01
    sql
  • javascript作用于作用域链的示例分析
    这篇文章主要介绍javascript作用于作用域链的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、JavaScript作用域任何程序设计语言都有作用域的概念,简单的说,作...
    99+
    2022-10-19
  • Javascript的作用域和作用域链是什么
    这篇文章主要介绍Javascript的作用域和作用域链是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Javascript 的作用域和作用域链作用域: 作用域是定义变量...
    99+
    2022-10-19
  • VB.NET中变量作用域的作用是什么
    VB.NET中变量作用域的作用是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在一个过程或函数外声明的变量是全局变量,对本程序内部所有的过程和函数都起作用;而在一个过程或函...
    99+
    2023-06-17
  • nodejs中的package.json的作用
    这篇文章主要讲解了“nodejs中的package.json的作用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“nodejs中的package.json的作...
    99+
    2022-10-19
  • vue中的nextTick的作用
    vue里面,常用的事件onMounted里,总喜欢用一个nextTick: onMounted(() => { nextTick(() => { init(); });}); 这个东西有啥用呢?我总搞不懂。 今天我忽然有点明白了。...
    99+
    2023-08-30
    vue nextTick
  • Python作用域的操作步骤是怎样的
    本篇文章给大家分享的是有关Python作用域的操作步骤是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。局部,上层,模块,内置python编辑器按照变量定义的位置来确定作用...
    99+
    2023-06-17
  • JavaScript作用域和作用域链的示例分析
    这篇文章给大家分享的是有关JavaScript作用域和作用域链的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。作用域(Scope)1. 什么是作用域作用域是在运行时代码中...
    99+
    2022-10-19
  • Vps的作用介绍
    本篇内容介绍了“Vps的作用介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!vps是什么vps又称为虚拟专用服务器,是指利用虚拟服务器软件...
    99+
    2023-06-07
  • Java中volatile 的作用
    目录内存可见性禁止指令重排序总结前言: volatile 是 Java 并发编程的重要组成部分,也是常见的面试题之一,它的主要作用有两个:保证内存的可见性和禁止指令重排序。下面我们具...
    99+
    2022-11-13
  • Python -- while的作用(未
    1,判断条件(例如保证输入) import math #Get base inputOK = False while not inputOK:     base = input('Enter base: ')     if type(ba...
    99+
    2023-01-31
    作用 Python
  • @Data注解的作用
    @Data 是 Lombok 中的一个注解,它可以自动生成以下代码: 所有字段的 get 和 set 方法。toString() 方法,用于将对象转换成字符串形式,便于日志输出和调试。hashCode() 方法,用于计算对象的哈希值。equ...
    99+
    2023-09-02
    java 开发语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作