广告
返回顶部
首页 > 资讯 > 数据库 >MySQL中的统计信息相关参数介绍
  • 855
分享到

MySQL中的统计信息相关参数介绍

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

统计信息的作用 上周同事在客户现场遇到了由于统计信息的原因,导致应用数据迁移时间过慢,整个迁移差点失败。关键时刻同事发现测试环境与生产环境sql语句执行计划不一致,立刻收集统计信息才保

统计信息的作用


上周同事在客户现场遇到了由于统计信息的原因,导致应用数据迁移时间过慢,整个迁移差点失败。关键时刻同事发现测试环境与生产环境sql语句执行计划不一致,立刻收集统计信息才保证迁移得以正常完成。 
统计信息对于SQL的执行时间有重要的影响,统计信息的不准确会导致SQL的执行计划不准确,从而致使SQL执行时间变慢,oracle DBA非常了解统计信息的收集规则,同样在Mysql中也有相关的参数去控制统计信息。


相关参数



innodb_stats_auto_recalc

控制innodb是否自动收集统计信息,默认是打开的。当表中数据变化超过%10时候,就会重新计算统计信息。参数的生效依赖于建表时指定innodb_stats_persistent是打开的或CREATE TABLE , ALTER TABLE 时指定STATS_PERSISTENT=1采样page的个数通过参数innodb_stats_persistent_sample_pages来控制。

  • 测试验证

创建一张测试表,并在表上创建一个索引:

create table dhytest (id int) STATS_PERSISTENT=1; create index idx_id on dhytest(id); 

通过mysql.innodb_index_stats可以查看索引最后收集统计信息的时间,这里的聚集索引我们删除先不用去看,只看自己创建的二级索引

[root@shadow:/root 5.7.18-log_Instance1 root@localhost:test 22:37:43]>select * from mysql.innodb_index_stats where database_name = 'test';
+---------------+------------+-----------------+---------------------+--------------+------------+-------------+-----------------------------------+ | database_name | table_name | index_name      | last_update         | stat_name    | stat_value | sample_size | stat_description                  |
+---------------+------------+-----------------+---------------------+--------------+------------+-------------+-----------------------------------+ | test          | dhytest    | idx_id          | 2017-07-10 22:36:06 | n_diff_pfx01 |          0 |           1 | id                                |
| test          | dhytest    | idx_id          | 2017-07-10 22:36:06 | n_diff_pfx02 |          0 |           1 | id,DB_ROW_ID                      |
| test          | dhytest    | idx_id          | 2017-07-10 22:36:06 | n_leaf_pages |          1 |        NULL | Number of leaf pages in the index |
| test          | dhytest    | idx_id          | 2017-07-10 22:36:06 | size         |          1 |        NULL | Number of pages in the index      |
+---------------+------------+-----------------+---------------------+--------------+------------+-------------+-----------------------------------+ 7 rows in set (0.00 sec) 

我们手工往表中插入数据,让数据的变化超过%10

 [root@shadow:/root 5.7.18-log_Instance1 root@localhost:test 22:37:56]>insert into dhytest values (10);
Query OK, 1 row affected (0.00 sec)

[root@shadow:/root 5.7.18-log_Instance1 root@localhost:test 22:38:17]>insert into dhytest select * from dhytest;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

[root@shadow:/root 5.7.18-log_Instance1 root@localhost:test 22:38:28]>insert into dhytest select * from dhytest;
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

[root@shadow:/root 5.7.18-log_Instance1 root@localhost:test 22:38:31]>insert into dhytest select * from dhytest;
Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0

[root@shadow:/root 5.7.18-log_Instance1 root@localhost:test 22:38:34]>insert into dhytest select * from dhytest;
Query OK, 8 rows affected (0.00 sec)
Records: 8  Duplicates: 0  Warnings: 0

[root@shadow:/root 5.7.18-log_Instance1 root@localhost:test 22:38:35]>insert into dhytest select * from dhytest;
Query OK, 16 rows affected (0.00 sec)
Records: 16  Duplicates: 0  Warnings: 0 

这时我们在查看下mysql.innodb_index_stats表,last_update时间发生了变化


	

[root@shadow:/root 5.7.18-log_Instance1 root@localhost:test 22:38:36]>select * from mysql.innodb_index_stats where database_name = 'test'; +---------------+------------+-----------------+---------------------+--------------+------------+-------------+-----------------------------------+ | database_name | table_name | index_name      | last_update         | stat_name    | stat_value | sample_size | stat_description                  | +---------------+------------+-----------------+---------------------+--------------+------------+-------------+-----------------------------------+ | test          | dhytest    | idx_id          | 2017-07-10 22:38:28 | n_diff_pfx01 |          1 |           1 | id                                | | test          | dhytest    | idx_id          | 2017-07-10 22:38:28 | n_diff_pfx02 |          2 |           1 | id,DB_ROW_ID                      | | test          | dhytest    | idx_id          | 2017-07-10 22:38:28 | n_leaf_pages |          1 |        NULL | Number of leaf pages in the index | | test          | dhytest    | idx_id          | 2017-07-10 22:38:28 | size         |          1 |        NULL | Number of pages in the index      | +---------------+------------+-----------------+---------------------+--------------+------------+-------------+-----------------------------------+ 7 rows in set (0.00 sec)


innodb_stats_persistent


控制是否将统计信息持久到磁盘当中,设置此参数之后我们就不需要实时去收集统计信息了,因为实时收集统计信息在高并发下可能会造成一定的性能上影响,并且会导致执行计划有所不同。建议是将此参数打开,将innodb_stats_auto_recalc参数进行关闭。



innodb_stats_persistent_sample_pages


控制收集统计信息时采样的page数量,默认是20。收集的page数量越多,每次收集统计信息的实际则越长,但是统计信息也相对比较准确。

我们可以在创建表的时候对不同的表指定不同的page数量、是否将统计信息持久化到磁盘上、是否自动收集统计信息


	

CREATE TABLE `t1` ( `id` int(8) NOT NULL auto_increment, `data` varchar(255), `date` datetime, PRIMARY KEY  (`id`), INDEX `DATE_IX` (`date`) ) ENGINE=InnoDB,  STATS_PERSISTENT=1,  STATS_AUTO_RECALC=1,  STATS_SAMPLE_PAGES=25;


innodb_stats_on_metadata


此参数在5.6.5版本之前是默认开启的,设置此参数后当我们执行show index 或者 show table status 或者访问INFORMATION_SCHEMA.TABLES or INFORMATION_SCHEMA.STATISTICS表时就会收集统计信息,但是这样可能会导致执行计划改变。 

在以前当表中记录变化超过1/16就会收集统计信息,但是现在如果设置了innodb_stats_persistent就不会有这样的说法了。

MySQL中的统计信息相关参数介绍

innodb_stats_include_delete_marked


5.6.35版本中新增的参数,就是在未提交的事务中如果我们删除了记录,收集统计信息的时候是排查这些删除了的记录的。这样就可能导致统计信息并不是很准确,设置此参数之后就是收集统计信息的时候包含未提交事务中被标记为已删除的数据。


innodb_stats_method


控制统计信息针对索引中NULL值的算法 

当设置为nulls_equal 所有的NULL值都视为一个value group 
当设置为nulls_unequal每一个NULL值被视为一个value group 
设置为nulls_ignored时 NULL值被忽略 

这个参数同事彭许生做过一些测试发现nulls_equal和nulls_unequal没有发现show index中的cardinality有不同的地方,但是如果设置为nulls_ignored的时候会有所不同。

  • 测 试

表结构数据

MySQL中的统计信息相关参数介绍

设置为nulls_ignored

MySQL中的统计信息相关参数介绍

设置为nulls_unequal

MySQL中的统计信息相关参数介绍

设置为nulls_equal

MySQL中的统计信息相关参数介绍


推荐配置

  • innodb_stats_method 统计信息的自动收集在高并发情况下可能会带来性能的抖动,建议将此参数关闭。 

  • innodb_stats_persistent 建议打开此参数将统计信息持久化到磁盘上 。

  • innodb_stats_include_delete_marked建议设置开启,这样可以针对未提交事务中删除的数据也收集统计信息 。

  • innodb_stats_method经过测试和mos查看到的按默认配置就可以,当然如果设置nulls_ignored时候会让你的语句走到索引,但是效率并不一定是好的。

您可能感兴趣的文档:

--结束END--

本文标题: MySQL中的统计信息相关参数介绍

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

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

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

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

下载Word文档
猜你喜欢
  • MySQL中的统计信息相关参数介绍
    统计信息的作用 上周同事在客户现场遇到了由于统计信息的原因,导致应用数据迁移时间过慢,整个迁移差点失败。关键时刻同事发现测试环境与生产环境SQL语句执行计划不一致,立刻收集统计信息才保...
    99+
    2022-10-18
  • MySQL索引统计信息更新相关的参数有哪些
    这篇文章主要讲解了“MySQL索引统计信息更新相关的参数有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL索引统计信息更新相关的参数有哪些”吧!...
    99+
    2022-10-18
  • 【MYSQL】两阶段提交及相关参数介绍
        由于Mysql的事务日志包含二进制日志和存储引擎日志,当发生崩溃恢复时,MySQL主节点通过redo log进行恢复,而在主从复制的环境下,slaver节点是...
    99+
    2022-10-18
  • MySQL中的相关工具介绍
    这篇文章主要介绍“MySQL中的相关工具介绍”,在日常操作中,相信很多人在MySQL中的相关工具介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL中的相关工具介绍”...
    99+
    2022-10-18
  • PostgreSQL统计信息中相关的数据字典表有哪些
    本篇内容介绍了“PostgreSQL统计信息中相关的数据字典表有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学...
    99+
    2022-10-19
  • PHP中的日期相关函数介绍
    这篇文章主要介绍“PHP中的日期相关函数介绍”,在日常操作中,相信很多人在PHP中的日期相关函数介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP中的日期相关函数介绍”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-20
  • MySQL数据库锁机制的相关原理介绍
    这篇文章主要讲解了“MySQL数据库锁机制的相关原理介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL数据库锁机制的相关原理介绍”吧!  不同于行...
    99+
    2022-10-18
  • 统计信息DBMS_STATS包的一些参数解释
    DBMS_STATS.SET_GLOBAL_PREFS (     pname     IN   VARCHAR2,   &n...
    99+
    2022-10-18
  • JVM的关键系统参数介绍和详细配置
    JVM(Java Virtual Machine)是一个虚拟机,它是Java程序的运行环境。在JVM的运行过程中,有一些关键的系统参...
    99+
    2023-08-29
    JVM
  • Python中的数据类型的相关操作介绍
    本篇内容主要讲解“Python中的数据类型的相关操作介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python中的数据类型的相关操作介绍”吧!1-1 Python中的数据类型一、整数Pyth...
    99+
    2023-06-02
  • mysql中慢查询日志的相关参数
    本篇内容介绍了“mysql中慢查询日志的相关参数”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、 相关参数:• slow_query_lo...
    99+
    2023-06-06
  • C#获取计算机硬件与操作系统的相关信息
    1、项目引用System.Management库文件 2、创建HardwareHandler.cs类文件 namespace HardInfoTest.Utility { /...
    99+
    2022-11-13
  • 基于Android 监听ContentProvider 中数据变化的相关介绍
    如果ContentProvider的访问者需要知道ContentProvider中的数据的变化情况,可以在ContentProvider发生数据变化时调用getContentR...
    99+
    2022-06-06
    数据 Android
  • 数据库中表、字段等相关信息(oracle、mysql、达梦)查询
    oracle数据库: 查询所有用户 select * from all_users -- where USERNAME like 'sys_%' 查询所有表信息,可根据用户查询 SELECT * FROM ...
    99+
    2023-09-12
    数据库 sql
  • PostgreSQL中结合实际的内存数据介绍相关数据结构
    小编给大家分享一下PostgreSQL中结合实际的内存数据介绍相关数据结构,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、数据结构   typedef st...
    99+
    2022-10-19
  • 学生信息管理系统的数据库设计MySQL
    学生信息管理系统的数据库设计 1.课程设计目的 学生信息管理系统是一个教育单位不可缺少的部分。一个功能齐全、简单易用的信息管理系统不但能有效地减轻学校相关工作人员的工作负担,它的内容对于学校的决策者和...
    99+
    2023-10-23
    数据库 mysql
  • PostgreSQL中与执行计划相关的配置参数是什么
    本篇内容主要讲解“PostgreSQL中与执行计划相关的配置参数是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PostgreSQL中与执行计划相关的配置参...
    99+
    2022-10-18
  • MSSQL·查询数据库中所有索引的相关信息
    阅文时长 | 0.45分钟 字数统计 | 784字符 主要内容 | 1、引言&背景 2、声明与参考资料 『MSSQL·查询数据库中所有索引的相关信息』 编写人 | SCscHero 编写时间 | 2...
    99+
    2019-04-16
    MSSQL·查询数据库中所有索引的相关信息
  • 数据库中怎么找出未收集统计信息以及统计信息过期的表
    小编给大家分享一下数据库中怎么找出未收集统计信息以及统计信息过期的表,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!下面这个查询可以找到从未收集过统计信息或者统计信息过期的表。EXEC&nb...
    99+
    2022-10-18
  • 如果 NULLIF() 中的参数不相等,MySQL 如何计算表达式?
    我们知道 MySQL NULLIF() 控制流函数将返回第一个参数,这两个参数不相同。返回第一个参数,因为如果两个参数不相同,MySQL 会计算第一个参数两次。示例mysql> Select NULLIF('Tutorials...
    99+
    2023-10-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作