官方文档如下描述:
This variable indicates the number of equality ranges in an equality comparison condition when the optimizer should switch from using index dives to index statistics in estimating the number of qualifying rows. It applies to evaluation of expressions that have either of these equivalent forms, where the optimizer uses a nonunique index to look up col_name values:

col_name IN(val1, ..., valN)
col_name = val1 OR ... OR col_name = valN

In both cases, the expression contains N equality ranges. The optimizer can make row estimates using index dives or index statistics. If eq_range_index_dive_limit is greater than 0, the optimizer uses existing index statistics instead of index dives if there are eq_range_index_dive_limit or more equality ranges. Thus, to permit use of index dives for up to N equality ranges, set eq_range_index_dive_limit to N + 1. To disable use of index statistics and always use index dives regardless of N, set eq_range_index_dive_limit to 0.

简单来说就是根据eq_range_index_dive_limit参数设置的阀值来按照不同算法预估影响行数,对于IN或OR条件中的每个范围段视为一个元组,对于元组数低于eq_range_index_dive_limit参数阀值时使用index dive,高于阀值时使用
index dive:针对每个元组dive到index中使用索引完成元组数的估算,类似于使用索引进行实际查询得到影响行数
index statistics:即根据索引的统计数值进行估算,例如索引统计信息计算出每个等值影响100条数据,那么IN条件中包含5个等值则影响5*100条记录

在MySQL 5.6版本中引入eq_range_index_dive_limit参数,默认值为10,通常业务在使用IN时会超过10个值,因此在MySQL 5.7版本中将默认阀值设为200。

========================================
测试环境:

MySQL版本:5.6.20

测试用例表:t_disk_check_result_his,该表存放的1200+台服务器的约95万条磁盘数据

测试目的:通过各种角度来验证index dive和index statistics两种方式的优缺点

1、检查参数
show variables like '%eq_range_index_dive_limit%';

2、查看查询使用到的索引和表
SHOW INDEX FROM t_disk_check_result_his \G

show table status like 't_disk_check_result_his' \G

SELECT *
FROM innodb_index_stats
WHERE table_name='t_disk_check_result_his'\G

3、查看SQK执行计划
DESC SELECT *
FROM t_disk_check_result_his
WHERE server_ip IN(
'1.1.1.1',
'1.1.1.2',
'1.1.1.3',
);
调整IN条件中的值数量,查看影响行数

经过多次测试,得到以下数据:

根据步骤2在索引上获得的数据,949337/2674=355 恰好等于超过eq_range_index_dive_limit参数阀值的平均影响行数,
实际执行发现,对于低于eq_range_index_dive_limit参数阀值的查询,预估影响行数和实际影响行数相差不多,较为准确。
========================================
使用profiling来查看, IN条件中包含9个server_ip时,即使用index dive方式消耗如下:

IN条件中包含11个server_ip时,即使用index dive方式消耗如下:

在statistics步骤中,使用index dive方式消耗的时间约是index statistics方式的3.3倍。
========================================
将eq_range_index_dive_limit参数设置为10,来测试IN条件中包含100个server_ip的资源消耗:

将eq_range_index_dive_limit参数设置为200,来测试IN条件中包含100个server_ip的资源消耗:

IN条件中包含100个server_ip的相同条件下,使用index dive方式消耗的时间约是index statistics方式的213倍

========================================
结论:
在使用IN或者OR等条件进行查询时,MySQL使用eq_range_index_dive_limit参数来判断使用index dive还是使用index statistics方式来进行预估:
1、当低于eq_range_index_dive_limit参数阀值时,采用index dive方式预估影响行数,该方式优点是相对准确,但不适合对大量值进行快速预估。
2、当大于或等于eq_range_index_dive_limit参数阀值时,采用index statistics方式预估影响行数,该方式优点是计算预估值的方式简单,可以快速获得预估数据,但相对偏差较大。

=======================================
参考连接:
https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html
http://www.cnblogs.com/zhiqian-ali/p/6113829.html
http://blog.163.com/li_hx/blog/static/18399141320147521735442/

MySQL--eq_range_index_dive_limit参数学习相关推荐

  1. MySQL--eq_range_index_dive_limit参数学习,MYSQL 5.6 5.7处理数据分布不均的问题

    官方文档如下描述: This variable indicates the number of equality ranges in an equality comparison condition ...

  2. php django mysql配置文件_Mysql学习Django+mysql配置与简单操作数据库实例代码

    <Mysql学习Django+mysql配置与简单操作数据库实例代码>要点: 本文介绍了Mysql学习Django+mysql配置与简单操作数据库实例代码,希望对您有用.如果有疑问,可以联 ...

  3. 【笔记】MySQL的基础学习(二)

    [笔记]MySQL的基础学习(二) MySQL 老男孩  一 视图 视图其实就是给表起个别名 1.创建视图 格式:CREATE VIEW 视图名称 AS SQL语句 CREATE VIEW v1 AS ...

  4. C mysql带参数存储过程_C# 调用Mysql 带参数存储过程

    使用C#调用Mysql 带参数的存储过程: 1.创建带参数的存储过程:USP_Temp_Test 2.两个参数:IN 参数为 P_XML , OUT 参数为 P_ErrorOut 3.C#代码调用该存 ...

  5. django连接mysql数据库_Django学习笔记(4)——Django连接数据库

    前言 在MVC或者MTV设计模式中,模型(M)代表对数据库的操作.那么如何操作数据库呢?本小节就认真学习一下.首先复习一下Django的整个实现流程 ,然后再实现一下使用数据库的整个流程,最后学习一下 ...

  6. mysql root密码忘记2018_MySQL数据库之2018-03-28设置及修改mysql用户密码学习笔记

    本文主要向大家介绍了MySQL数据库之2018-03-28设置及修改mysql用户密码学习笔记 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 退出mysql方法 quit或者e ...

  7. MySQL核心参数含义的源码解析

    引言 你访问的网站,大部分使用Apache服务器;你访问的网站,大部分使用Linux或BSD操作系统:你访问的网站,大部分使用MySQL数据库;你提交DNS域名查询请求大多由BIND服务器分析处理;你 ...

  8. mysql高级篇学习笔记

    目录 前言 1 mysql安装及运行(linux环境) 1.1 安装前检查 1.2 MySQL卸载 ①**关闭 mysql 服务** ②**查看当前 mysql 安装状况** ③**卸载上述命令查询出 ...

  9. MySQL与MariaDB学习笔记

    博客链接: http://codeshold.me/2017/10/learning_mysql_mariadb_notes.html 本文是<MySQL与MariaDB学习指南>的简要学 ...

最新文章

  1. 自动检索、修复Python代码bug,微软推出DeepDebug
  2. 域的非验证方式还原与验证方式还原的区别
  3. python爬虫入门-Python 爬虫从入门到进阶之路(一)
  4. ArrayBlockingQueue源码
  5. 杭州某知名xxxx公司急招大量java以及大数据开发工程师
  6. 一篇介绍OpenJDK字体的文章
  7. 强制更改wifi名前缀CMCC
  8. html 好看表格样式,简单但是好看的表格样式
  9. 创客匠人:怎么用微信小程序直播?
  10. windows 启动c\windows\systen32\spool\DRIVERS\W32x86\3\ssnetmon. dll 时出现问题 找不到指定模块
  11. google gflags使用指南
  12. 【原生JS小实例】加减乘除取余计算器
  13. Python并发编程
  14. 基于vue3.0的遮罩
  15. 微信公众号如何推广运营
  16. 山东联通某地市分公司科技岗面经+经验分享
  17. 江苏省数学建模省赛答辩准备
  18. java判断标签闭合_html转PDF(java)非常奇怪的错误,标签没闭合
  19. 如何用TextPad预览html,利用TextPad编辑代码的各种技巧
  20. 为什么美国程序员不用加班,而中国程序员就只能996?

热门文章

  1. (已解决)ERROR 2013 (HY000):连接MySql出错
  2. 使用 Apple Watch S6 测量血氧教程
  3. vasp 模拟退火_VASP 计算问题小结
  4. DiI(细胞膜红色荧光探针)被广泛应用于神经等细胞或组织的示踪剂或长期示踪剂
  5. 汕尾市海陆丰民间开胃小食摘录
  6. bzip2: Data integrity error when decompressing--apt-get update
  7. Matlab 非线性回归
  8. 线上Debug神器--Arthas(阿尔萨斯)
  9. “二选一”突袭,暗战“山姆”?
  10. Java调用aliyun OCR图文识别