InnoDB的统计信息表

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

MySQL中的InnoDB统计相关说明:

参考:https://www.jianshu.com/p/0b8d2f9cee7b

其他参考:https://www.cnblogs.com/sunss/p/6110383.html

       叶总:https://mp.weixin.qq.com/s/1MsyxhtG6Zk3Q9gIV2QVbA  和 https://yq.aliyun.com/articles/396153

           董爷:http://www.itdks.com/eventlist/detail/1161


下面的介绍都是以MySQL社区版5.7为例,测试用的表是随便找了个grafana上面的dashboard表,数据内容不方便贴出来( ╯□╰ )。

(mysql) > show create table test.dashboard \G

***************************[ 1. row ]***************************

Table        | dashboard

Create Table | CREATE TABLE `dashboard` (

  `id` bigint(20) NOT NULL AUTO_INCREMENT,

  `version` int(11) NOT NULL,

  `slug` varchar(255) NOT NULL,

  `title` varchar(255) NOT NULL,

  `data` mediumtext,

  `org_id` bigint(20) NOT NULL,

  `created` datetime NOT NULL,

  `updated` datetime NOT NULL,

  `updated_by` int(11) DEFAULT NULL,

  `created_by` int(11) DEFAULT NULL,

  `gnet_id` bigint(20) DEFAULT NULL,

  `plugin_id` varchar(255) DEFAULT NULL,

  PRIMARY KEY (`id`),

  UNIQUE KEY `UQE_dashboard_org_id_slug` (`org_id`,`slug`),

  KEY `IDX_dashboard_org_id` (`org_id`),

  KEY `IDX_dashboard_gnet_id` (`gnet_id`),

  KEY `IDX_dashboard_org_id_plugin_id` (`org_id`,`plugin_id`)

) ENGINE=InnoDB AUTO_INCREMENT=582 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC



mysql库中有innodb_index_stats、innodb_table_stats 对innodb的信息进行统计,可根据统计信息,分析表的复杂度,为优化做准备。



1) innodb_table_stats


(mysql) > desc innodb_table_stats;

+--------------------------+---------------------+--------+-------+-------------------+-----------------------------+

| Field                    | Type                | Null   | Key   | Default           | Extra                       |

|--------------------------+---------------------+--------+-------+-------------------+-----------------------------|

| database_name            | varchar(64)         | NO     | PRI   | <null>            |                             |

| table_name               | varchar(64)         | NO     | PRI   | <null>            |                             |

| last_update              | timestamp           | NO     |       | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |

| n_rows                   | bigint(20) unsigned | NO     |       | <null>            |                             |

| clustered_index_size     | bigint(20) unsigned | NO     |       | <null>            |                             |

| sum_of_other_index_sizes | bigint(20) unsigned | NO     |       | <null>            |                             |

+--------------------------+---------------------+--------+-------+-------------------+-----------------------------+

字段详解:

database_name 数据库名

table_name 表名

last_update 最后一次更新时间

n_rows 表中总有多少列数据

clustered_index_size 聚集索引大小(数据页)

sum_of_other_index_sizes 其他索引大小(数据页)


(mysql) > select * from mysql.innodb_table_stats order by n_rows desc;

+-----------------+---------------+---------------------+----------+------------------------+----------------------------+

| database_name   | table_name    | last_update         |   n_rows |   clustered_index_size |   sum_of_other_index_sizes |

|-----------------+---------------+---------------------+----------+------------------------+----------------------------|

| test            | dashboard     | 2017-12-25 16:38:10 |      296 |                   1441 |                          4 |

| sys             | sys_config    | 2017-11-02 16:05:29 |        6 |                      1 |                          0 |

| db1             | t1            | 2018-02-25 13:57:14 |        3 |                      1 |                          0 |

| db1             | t2            | 2018-02-25 13:57:16 |        0 |                      1 |                          0 |

| mysql           | gtid_executed | 2017-11-02 16:05:20 |        0 |                      1 |                          0 |

| test            | a             | 2017-11-02 18:39:37 |        0 |                      1 |                          0 |

| test            | article       | 2017-12-25 16:46:04 |        0 |                      1 |                          0 |

| test            | t3            | 2018-02-25 13:57:06 |        0 |                      1 |                          1 |

| test            | user_task     | 2018-01-10 10:43:54 |        0 |                      1 |                          1 |

+-----------------+---------------+---------------------+----------+------------------------+----------------------------+


数据详解(以test.dashboard表为例):

select @@innodb_page_size;  默认为16K

clustered_index_size 为1441个page   --->  聚集索引所需磁盘空间为  1441*16K= 22MB

sum_of_other_index_sizes 为4个page  --->  其他索引所需磁盘空间为  4*16K=64KB



另一种检索索引大小的方式:

SELECT

  SUM(stat_value) pages,

  index_name,

  (SUM(stat_value)*@@innodb_page_size)/1024/1024 as size_MB

FROM

  mysql.innodb_index_stats

WHERE table_name = 'dashboard'

  AND stat_name = 'size'

GROUP BY index_name;

+-------+--------------------------------+-------------+

| pages | index_name                     | size_MB     |

+-------+--------------------------------+-------------+

|     1 | IDX_dashboard_gnet_id          |  0.01562500 |

|     1 | IDX_dashboard_org_id           |  0.01562500 |

|     1 | IDX_dashboard_org_id_plugin_id |  0.01562500 |

|  1441 | PRIMARY                        | 22.51562500 |

|     1 | UQE_dashboard_org_id_slug      |  0.01562500 |

+-------+--------------------------------+-------------+

# 聚集索引约22MB,其余4个非聚集索引加起来约64KB。



可以看到,上面两种检查索引大小的命令结果是相近的。




2) innodb_index_stats

对innodb中所有索引进行统计


(mysql) > desc innodb_index_stats;

+------------------+---------------------+--------+-------+-------------------+-----------------------------+

| Field            | Type                | Null   | Key   | Default           | Extra                       |

|------------------+---------------------+--------+-------+-------------------+-----------------------------|

| database_name    | varchar(64)         | NO     | PRI   | <null>            |                             |

| table_name       | varchar(64)         | NO     | PRI   | <null>            |                             |

| index_name       | varchar(64)         | NO     | PRI   | <null>            |                             |

| last_update      | timestamp           | NO     |       | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |

| stat_name        | varchar(64)         | NO     | PRI   | <null>            |                             |

| stat_value       | bigint(20) unsigned | NO     |       | <null>            |                             |

| sample_size      | bigint(20) unsigned | YES    |       | <null>            |                             |

| stat_description | varchar(1024)       | NO     |       | <null>            |                             |

+------------------+---------------------+--------+-------+-------------------+-----------------------------+

字段详解:

database_name 数据库名

table_name 表名

index_name 索引名

last_update 最后一次更新时间

stat_name 统计名

stat_value 统计值

sample_size 样本大小

stat_description 统计说明-索引对应的字段名



(mysql) > select * from mysql.innodb_index_stats where database_name='test'  and table_name='dashboard' ; 

+-----------------+---------------+--------------------------------+---------------------+--------------+--------------+---------------+-----------------------------------+

| database_name   | table_name    | index_name                     | last_update         | stat_name    |   stat_value |   sample_size | stat_description                  |

|-----------------+---------------+--------------------------------+---------------------+--------------+--------------+---------------+-----------------------------------|

| test            | dashboard     | PRIMARY                        | 2017-12-25 16:38:10 | size         |         1441 |        <null> | Number of pages in the index      |

| test            | dashboard     | PRIMARY                        | 2017-12-25 16:38:10 | n_leaf_pages |         1225 |        <null> | Number of leaf pages in the index |

| test            | dashboard     | PRIMARY                        | 2017-12-25 16:38:10 | n_diff_pfx01 |          296 |            20 | id                                |

| test            | dashboard     | IDX_dashboard_org_id           | 2017-12-25 16:38:10 | n_diff_pfx02 |          295 |             1 | org_id,id                         |

| test            | dashboard     | IDX_dashboard_gnet_id          | 2017-12-25 16:38:10 | n_diff_pfx02 |          295 |             1 | gnet_id,id                        |

| test            | dashboard     | UQE_dashboard_org_id_slug      | 2017-12-25 16:38:10 | n_diff_pfx02 |          295 |             1 | org_id,slug                       |

| test            | dashboard     | IDX_dashboard_org_id_plugin_id | 2017-12-25 16:38:10 | n_diff_pfx03 |          295 |             1 | org_id,plugin_id,id               |

| test            | dashboard     | IDX_dashboard_org_id_plugin_id | 2017-12-25 16:38:10 | n_diff_pfx02 |           24 |             1 | org_id,plugin_id                  |

| test            | dashboard     | IDX_dashboard_org_id           | 2017-12-25 16:38:10 | n_diff_pfx01 |           14 |             1 | org_id                            |

| test            | dashboard     | UQE_dashboard_org_id_slug      | 2017-12-25 16:38:10 | n_diff_pfx01 |           14 |             1 | org_id                            |

| test            | dashboard     | IDX_dashboard_org_id_plugin_id | 2017-12-25 16:38:10 | n_diff_pfx01 |           14 |             1 | org_id                            |

| test            | dashboard     | IDX_dashboard_gnet_id          | 2017-12-25 16:38:10 | n_diff_pfx01 |            7 |             1 | gnet_id                           |

..........   其余的内容忽略 ................

+-----------------+---------------+--------------------------------+---------------------+--------------+--------------+---------------+-----------------------------------+

数据详解:

  可以看到IDX_dashboard_org_id_plugin_id 实际上存了3个统计信息(原因:统计索引信息时,是根据最左原则,要统计各种组合的。比如(a,b) 索引,要统计(a), (a,b), (a,b,pk) 三种信息,而不是只统计(a,b)这个信息)

  1 stat_name=size时:stat_value表示索引的页的数量

  2 stat_name=n_leaf_pages时候,此时stat_value显示的是叶子节点的数量。

  3 stat_name=n_diff_pfxNN时候,此时stat_value显示的索引字段中唯一值的数量,具体点就是:

    3.1) n_diff_pfx01表示索引第一列distinct之后的数量

    3.2) n_diff_pfx02表示索引前两列distinct之后的数量

    3.3) 对于非唯一索引,会在原有列之后加上主键索引

         例如: 

           index_name=IDX_dashboard_org_id_plugin_id AND stat_name=n_diff_pfx03情况下:

           > select count(distinct plugin_id,org_id,id)  from test.dashboard ;   -- 结果是 295

                

           index_name=IDX_dashboard_org_id_plugin_id AND stat_name=n_diff_pfx02情况下:

           > select count(distinct plugin_id,org_id)  from test.dashboard ;   -- 结果是 24

                

           index_name=IDX_dashboard_org_id_plugin_id AND stat_name=n_diff_pfx01情况下:

           > select count(distinct org_id)  from test.dashboard ;   -- 结果是 14



其他:

关于innodb_index_stats、innodb_table_stats 这2张表,还有很多的参数与之相关,例如innodb_stats_persistent、innodb_stats_persistent_sample_pages、innodb_stats_auto_recalc 等,这里不做介绍了,在早先的博文里面有相关的介绍。










本文转自 lirulei90 51CTO博客,原文链接:http://blog.51cto.com/lee90/2072846,如需转载请自行联系原作者
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
关系型数据库 MySQL 数据库
InnoDB事务和锁定信息:如何识别和解决阻塞查询问题
InnoDB事务和锁定信息:如何识别和解决阻塞查询问题
|
5月前
|
存储 关系型数据库 分布式数据库
PolarDB产品使用问题之如何用InnoDB引擎创建Federated表
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
50 1
|
存储 关系型数据库 MySQL
MySQL使用InnoDB引擎时一张表最大可以储存数据大小为 64TB,那为什么当表中的单行数据达到16KB时,这张表只能储存一条数据?
MySQL使用InnoDB引擎时一张表最大可以储存数据大小为 64TB,那为什么当表中的单行数据达到16KB时,这张表只能储存一条数据?
155 0
|
关系型数据库 MySQL 测试技术
只有.frm和.ibd文件时如何批量恢复InnoDB的表---发表到爱可生开源社区
很多时候因为MySQL数据库不能启动而造成数据无法访问,但应用的数据通常没有丢失,只是系统表空间等其它文件损坏了,或者遇到MySQL的bug。
134 0
|
存储 运维 安全
数据库运维之InnoDB存储引擎表损坏修复方法
InnoDB存储引擎表的损坏可能是多种因素导致的,比如服务器断电、系统崩溃、硬盘损坏、写数据过程中mysqld进程被kill掉。
1044 0
|
存储 关系型数据库 MySQL
MySQL InnoDB表和索引之聚簇索引与第二索引
MySQL InnoDB表和索引之聚簇索引与第二索引
88 0
|
存储 SQL 缓存
【MySQL从入门到精通】【高级篇】(六)MySQL表的存储引擎,InnoDB与MyISAM的对比
上一篇文章介绍了MySQL中SQL语句的执行流程 【MySQL从入门到精通】【高级篇】(五)MySQL的SQL语句执行流程,在介绍执行流程时提到了InnoDB和MyISAM两种存储引擎。这篇文章将来详细介绍下这两种存储引擎。
263 0
【MySQL从入门到精通】【高级篇】(六)MySQL表的存储引擎,InnoDB与MyISAM的对比
|
SQL 关系型数据库 MySQL
[MySQL优化案例]系列 — 索引、提交频率对InnoDB表写入速度的影响
[MySQL优化案例]系列 — 索引、提交频率对InnoDB表写入速度的影响
135 0
[MySQL优化案例]系列 — 索引、提交频率对InnoDB表写入速度的影响
|
存储 Oracle 关系型数据库
[MySQL优化案例]系列 — 优化InnoDB表BLOB列的存储效率
[MySQL优化案例]系列 — 优化InnoDB表BLOB列的存储效率
176 0
[MySQL优化案例]系列 — 优化InnoDB表BLOB列的存储效率
|
存储 关系型数据库 MySQL
InnoDB表聚集索引层高什么时候发生变化(2)
InnoDB表聚集索引层高什么时候发生变化