后面也会持续更新,学到新东西会在其中补充。
建议按顺序食用,欢迎批评或者交流!
缺什么东西欢迎评论!我都会及时修改的!
大部分截图和文章采用该书,谢谢这位大佬的文章,在这里真的很感谢让迷茫的我找到了很好的学习文章。我只是加上了自己的拙见。我只是记录学习没有任何抄袭意思
MySQL 是怎样运行的:从根儿上理解 MySQL - 小孩子4919 - 掘金小册
两种不同的统计数据存储方式
InnoDB
提供了两种存储统计数据的方式:
- 永久性的统计数据
这种统计数据存储在磁盘上,也就是服务器重启之后这些统计数据还在。 - 非永久性的统计数据
这种统计数据存储在内存中,当服务器关闭时这些这些统计数据就都被清除掉了,等到服务器重启之后,在某些适当的场景下才会重新收集这些统计数据。
系统变量innodb_stats_persistent
来控制到底采用哪种方式去存储统计数据。
在MySQL 5.6.6
之前,innodb_stats_persistent
的值默认是OFF
,也就是说InnoDB
的统计数据默认是存储到内存的,之后的版本中innodb_stats_persistent
的值默认是ON
,也就是统计数据默认被存储到磁盘中。
mysql> show variables like '%innodb_stats_persistent%';
+--------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------+-------+
| innodb_stats_persistent | ON |
| innodb_stats_persistent_sample_pages | 20 |
+--------------------------------------+-------+
2 rows in set (0.05 sec)
不过InnoDB
默认是以表为单位来收集和存储统计数据的,也就是说我们可以把某些表的统计数据(以及该表的索引统计数据)存储在磁盘上,把另一些表的统计数据存储在内存中。
在创建和修改表的时候通过指定STATS_PERSISTENT
属性来指明该表的统计数据存储方式:
CREATE TABLE 表名 (...) Engine=InnoDB, STATS_PERSISTENT = (1|0);
ALTER TABLE 表名 Engine=InnoDB, STATS_PERSISTENT = (1|0);
当STATS_PERSISTENT=1
时,表明想把该表的统计数据永久的存储到磁盘上。
当STATS_PERSISTENT=0
时,表明想把该表的统计数据临时的存储到内存中。
如果在创建表时未指定STATS_PERSISTENT
属性,那默认采用系统变量innodb_stats_persistent
的值作为该属性的值。
基于磁盘的永久性统计数据
某个表以及该表索引的统计数据存放到磁盘上时,实际上是把这些统计数据存储到了两个表里:
mysql> SHOW TABLES FROM mysql LIKE 'innodb%';
+---------------------------+
| Tables_in_mysql (innodb%) |
+---------------------------+
| innodb_index_stats |
| innodb_table_stats |
+---------------------------+
2 rows in set (0.00 sec)
innodb_table_stats
存储了关于表的统计数据,每一条记录对应着一个表的统计数据。innodb_index_stats
存储了关于索引的统计数据,每一条记录对应着一个索引的一个统计项的统计数据。
innodb_table_stats
mysql> desc mysql.innodb_table_stats;
+--------------------------+-----------------+------+-----+-------------------+-----------------------------------------------+
| Field | Type | Null | Key | Default | Extra |
+--------------------------+-----------------+------+-----+-------------------+-----------------------------------------------+
| database_name | varchar(64) | NO | PRI | NULL | |
| table_name | varchar(199) | NO | PRI | NULL | |
| last_update | timestamp | NO | | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP |
| n_rows | bigint unsigned | NO | | NULL | |
| clustered_index_size | bigint unsigned | NO | | NULL | |
| sum_of_other_index_sizes | bigint 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;
+---------------+--------------------+---------------------+---------+----------------------+--------------------------+
| database_name | table_name | last_update | n_rows | clustered_index_size | sum_of_other_index_sizes |
+---------------+--------------------+---------------------+---------+----------------------+--------------------------+
| test | single_table | 2025-02-02 10:51:10