首页 > 其他分享 >InnoDB之统计信息

InnoDB之统计信息

时间:2024-08-14 08:56:39浏览次数:13  
标签:stats name 信息 innodb mysql InnoDB 统计

一、InnoDB统计信息简介

InnoDB统计信息分为持久化统计信息和非持久化统计信息。持久化统计信息将统计信息存储在磁盘(mysql 库下),在数据库重启后保证统计信息的持久访问;非持久化统计信息在数据库重启或一些特定操作后会丢失,再次使用该表时会从新计算。

innodb_stats_auto_recalc 参数控制是否自动收集统计信息,在表发生重大改变后。默认为开启。

STATS_PERSISTENT, STATS_AUTO_RECALC ,STATS_SAMPLE_PAGES 子句可以加在CREATE TABLE和ALTER TABLE后,来单独指定innodb表的统计信息配置。

统计信息信息表位于mysql.innodb_table_stats 和mysql.innodb_index_stats ,可以查看last_update 列来确定统计信息的最后更新时间;还可以手动修改mysql.innodb_table_stats和mysql.innodb_index_stats的值来控制Innodb的执行计划。

innodb_stats_persistent 参数控制是否启用持久化统计信息,默认为开启。

二、持久化统计信息

​ innodb_stats_auto_recalc 参数设为1后,当表的DML更改超过10%后,innodb会异步的收集对应表的统计信息到innodb_index_stats 表,一般延迟可能会有几秒,如果需要立即完成统计信息的收集,使用ANALYZE TABLE 。

当一个表添加索引或者增加/删除列后,无论innodb_stats_auto_recalc参数是否启动,innodb都会收集索引的统计信息到innodb_index_stats 。

可以为单个表指定统信信息配置,例如:

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;  

STATS_PERSISTENT=1:开启持久化统计信息
STATS_AUTO_RECALC=1:开启自动收集统计信息
STATS_SAMPLE_PAGES=25;:在为索引列计算基数和其他统计信息时要采样的索引页数。

优化器使用关于键分布的估计统计信息,根据索引的相对选择性为执行计划选择索引。像ANALYZE TABLE这样的操作会导致InnoDB从表上的每个索引中随机抽样页面来估计索引的基数。Innodb_stats_persistent_sample_pages控制采样页面的数量。您可以在运行时调整设置,以管理优化器使用的统计估计的质量。缺省值为20。下列情况需要考虑修改采样值:

统计信息不准确,通过select distinct 索引列和mysql.innodb_index_stats的基数来确定统计信息是否准确,不准确则需要提高采样值。但是如果采样值设置的太高,又会造成ANALYZED TABLE执行效率低。如果无法在准确的统计数据和分析表执行时间之间取得平衡,可以考虑减少表中索引列的数量或限制分区的数量,以降低分析表的复杂性。考虑表的主键列的数量也很重要,因为主键列是附加到每个非唯一索引的

默认情况下,innoDB会收集未提交数据的统计信息,这样可能会导致执行计划并不是最优的执行计划。可以修改innodb_stats_include_delete_marked为ON(默认为off/0),这样就可以将删除或未提交的记录标记。

示例:

mysql> select @@innodb_stats_include_delete_marked;
+--------------------------------------+
| @@innodb_stats_include_delete_marked |
+--------------------------------------+
|                                    0 |
+--------------------------------------+
会话A:
mysql> select * from mysql.innodb_table_stats where database_name='test' and table_name='t1'\G
*************************** 1. row ***************************
           database_name: test
              table_name: t1
             last_update: 2023-06-03 15:24:37
                  n_rows: 12
    clustered_index_size: 1
sum_of_other_index_sizes: 0
1 row in set (0.00 sec)

mysql> select count(*) from test.t1;
+----------+
| count(*) |
+----------+
|       12 |
+----------+
1 row in set (0.05 sec)
--此时统计信息记录值为12行,查询的表也为23行

会话B
mysql> insert into test.t1 values(10,'jjj');
Query OK, 1 row affected (0.00 sec)

mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            0 |
+--------------+
1 row in set (0.00 sec)
--没有commit,并且没有开启自动提交

会话A:
mysql> analyze table test.t1;
+---------+---------+----------+----------+
| Table   | Op      | Msg_type | Msg_text |
+---------+---------+----------+----------+
| test.t1 | analyze | status   | OK       |
+---------+---------+----------+----------+
1 row in set (0.00 sec)

mysql> select count(*) from test.t1;
+----------+
| count(*) |
+----------+
|       12 |
+----------+
1 row in set (0.05 sec)

mysql> select * from mysql.innodb_table_stats where database_name='test' and table_name='t1'\G
*************************** 1. row ***************************
           database_name: test
              table_name: t1
             last_update: 2023-06-03 15:26:08
                  n_rows: 13
    clustered_index_size: 1
sum_of_other_index_sizes: 0
1 row in set (0.00 sec)
--再次收集统计信息,统计信息的行值为13了,但是查询的仍为12行。

mysql.innodb_table_stats

database_name:数据库名称

table_name:表名

last_update:统计信息最后收集时间

n_rows:行数

clustered_index_size:集簇索引大小,页数量

sum_of_other_index_sizes:非集簇索引的大小,页数

mysql.innodb_index_stats

database_name: 数据库名称
table_name:表名
index_name:索引名
last_update:最后更新时间
stat_name:统计信息名称
stat_value:统计信息值
sample_size:采样大小
stat_description:统计信息描述

统计信息可以手动修改,来控制执行计划,手动修改统计信息后通过flush table table_name来加载统计信息到表。

三、非持久化统计信息

四、ANALYZED TABLE

ANALYZE TABLE 的复杂度取决于下面情况:

innodb_stats_persistent_sample_pages 参数配置

表中索引列的数量

表的分区数,如果没有分区,分区数为1

标签:stats,name,信息,innodb,mysql,InnoDB,统计
From: https://blog.csdn.net/qq_29431123/article/details/141180774

相关文章

  • 编写一个程序,打开和读取一个文本文件,并统计文件中每个单词出现的次数。用改进的二叉查
    /编写一个程序,打开和读取一个文本文件,并统计文件中每个单词出现的次数。用改进的二叉查找树存储单词及其出现的次数。程序在读入文件后会提供一个有三个选项菜单。第一个选项是列出所有的单词和出现的次数。第二个选项是让用户输入一个单词,程序报告该单词在文件中出现的次数。......
  • 如何获取VS Code扩展的版本更新信息
    获取VSCode扩展的版本更新的需求因为企业内部有架设私有扩展管理器的要求,但是对于一些官方市场的插件,希望可以自动获取这些扩展的更新并上传至私有扩展管理器。于是就有了本篇介绍的需求:通过API的方式获取VSCode扩展的更新。关于VSCode的私有扩展管理器可以参考:VS......
  • 一款Java 性能监控和统计工具——MyPerf4J!【送源码】
    背景随着所在公司的发展,应用服务的规模不断扩大,原有的垂直应用架构已无法满足产品的发展,几十个工程师在一个项目里并行开发不同的功能,开发效率不断降低。于是公司开始全面推进服务化进程,把团队内的大部分工程师主要精力全部都集中到服务化中。服务化可以让每个工程师仅在自己......
  • Java超市收银系统(五、收银统计)
    引言    收银统计功能,显示“请输入销售日期(yyyy-mm-dd):”,如果日期格式不正确,则显示“你输入的日期格式不正确,请重新输入”,输入正确后,查询统计当前日期所有的销售信息,输出显示格式如下:功能实现    首先,收银统计和前面介绍的Java超市收银系统(四、收银功能)-CS......
  • 嵌入式软件--C语言项目 客户信息管理系统
    考虑到目前C语言的学习是以为嵌入式做基础而进行的,项目所使用到的语法和结构都是嵌入式常用到的,这是较为特殊和针对性的项目,不与其他同名项目作比较。若有参考着谨慎借鉴。实现一个客户信息管理系统,功能包括添加客户、修改客户、删除客户、显示客户列表。1.需求说明(1)主菜单......
  • 【项目实战】基于Python的网络小说榜单信息爬取与数据可视化系统
    注意:该项目只展示部分功能,如需了解,文末咨询即可。本文目录1.开发环境2系统设计2.1设计背景2.2设计内容3系统页面展示3.1用户页面3.2管理员页面3.3功能展示视频4更多推荐5部分功能代码5.1爬虫代码5.2小说代码1.开发环境开发语言:Python技术框架:Fla......
  • 城市信息模型:构建未来智慧城市之基底座
    在智慧城市的宏大叙事中,城市信息模型(CityInformationModel,CIM)平台如同城市智能的神经中枢,将数据、空间与技术深度融合,为城市规划、管理、服务、居民生活提供了前所未有的洞察与优化途径。CIM平台的构建不仅是技术的集成,更是智慧城市的灵魂,它以三维可视化、数据驱动、实时交......
  • RSS 源:在信息洪流中找回你的时间掌控权
    200.RSS源管理简单介绍了RSS后,那么关键的一步就是建立好自己的RSS源了。并不是所所有平台都会提供RSS源,因此我们也没办法直接去订阅。目前使用RSS的难题之一就是RSS源的匮乏,是无数人重新拥抱RSS的第一大障碍。那么,如何去找RSS源呢?‍从平台上找一般来说,提供了......
  • Springboot计算机毕业设计火烈鸟兽医院信息管理gb7ej
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,兽医,宠物信息,挂号预约,宠物药品,药品种类,宠物病例,药品开具,宠物住院,医院吐槽开题报告内容一、研究背景与意义研究背景随着人们生活水平的提高和宠物......
  • 基于PaddleNLP信息抽取,uie微调打造自己专属的信息抽取模型
    基于PaddleNLP信息抽取,uie微调打造自己专属的信息抽取模型UIE模型简介UIE优势应用示例UIE开箱即用UIE适用抽取示例命名实体识别(NamedEntityRecognition,简称NER)关系抽取(RelationExtraction,简称RE)事件抽取(EventExtraction,简称EE)评论观点抽取情感倾向分类......