MySQL内核InnoDB存储引擎详解(11)

优化器永久统计资料数据在系统表mysql.innodb_table_stats和mysql.innodb_index_stats表中存储,这两个表中有个字段last_update可以用来判断统计信息最后更改时间。这两个表的数据也可以被手工更改。当手工更改完数据之后,要执行flush table 表名命令来重新load此表的统计资料。innodb_table_stats表中每个目标表一行记录,而innodb_index_stats表中每个索引会有多条记录 
Innodb_table_stats表结构

MySQL内核InnoDB存储引擎详解

MySQL内核InnoDB存储引擎详解

Innodb_index_stats表结构:

MySQL内核InnoDB存储引擎详解

Stat_name=n_diff_pfxNN参数:当是n_diff_pfx01时stat_value列表示索引第一列上的区别值有几个,当是n_diff_pfx02时stat_value列表示索引第一、二列上的区别值有几个,以此类推。而stat_description列显示了对应的逗号可开的索引列值。 
默认情况下永久优化器统计信息的属性是开启的, innodb_stats_persistent=ON 
非永久优化器统计信息会在每次服务器重启或者其他一些操作时被清理。 
优化器统计信息会被存储在磁盘上,通过设置innodb_stats_persistent=ON参数(默认)。

MySQL的查询优化器会基于评估好的统计资料选择合适的索引参与到执行计划中,而类似analyze table的语句会从索引中随机选取数据页参与到每个索引的基数评估中。而参数innodb_stats_persistent_sample_pages决定了参与评估的数据页的数量, 默认值是20。当语句执行的执行计划不是最优选择时,则考虑增加此参数,以便获得正确的统计资料。

当设置innodb_stats_persistent=OFF参数或者对单个表设置stats_persistent=0时,对应的统计资料就仅存在于内存中而非磁盘上,当服务器重启之后统计资料丢失。当然此类统计资料也可以周期性的更新。

比如执行analyze table语句手动刷新统计资料,或者在innodb_stats_on_metadata选项打开之后执行show table status/show index或查询information_schema.tables/statistics表时非永久统计资料会自动更新,当InnoDB检测到1/16的表数据被修改时也会更新。

索引页之间合并阈值

通过配置merge_threshold来确保当索引页的数据由于删除操作或者修改操作低于阈值, InnoDB会将此索引页和邻近的索引页合并。默认值是50,取值范围是1到50。

Merge_threshold参数可以定义在表上,也可以定义在一个独立的索引上。

CREATE TABLE t1 (
id INT,
KEY id_index (id)
) COMMENT='MERGE_THRESHOLD=45';
CREATE TABLE t1 (
id INT,
KEY id_index (id)
);
ALTER TABLE t1 COMMENT='MERGE_THRESHOLD=40';
CREATE TABLE t1 (
id INT,
KEY id_index (id) COMMENT 'MERGE_THRESHOLD=40'
);
CREATE TABLE t1 (id INT);
CREATE INDEX id_index ON t1 (id) COMMENT 'MERGE_THRESHOLD=40';

评估merge_threshold参数合理的方法是查看innodb_metrics表里的相关参数, 确保发生了较少的索引页合并且合并请求和成功合并的数量相当

mysql> SELECT NAME, COMMENT FROM INFORMATION_SCHEMA.INNODB_METRICS
WHERE NAME like '%index_page_merge%';
+-----------------------------+----------------------------------------+
| NAME | COMMENT |
+-----------------------------+----------------------------------------+
| index_page_merge_attempts | Number of index page merge attempts |
| index_page_merge_successful | Number of successful index page merges |
+-----------------------------+----------------------------------------+

重置InnoDB系统表空间

最简单的增加系统表空间的办法就是在初始化阶段配置数据文件的自增长, 
通过配置最后一个文件的autoextend属性,当数据文件空间不足时默认自动增长64M大小。 
也可以通过修改innodb_autoextend_increment参数修改自动增长的大小。

也可以通过增加另一个数据文件方法扩展表空间,步骤如下:

关闭MySQL
检查配置的最后一个数据文件是否是autoextend,如果是则根据当前数据文件的大小去掉自动扩展属性, 改成当前大小
mysql> SHOW VARIABLEs LIKE  '%innodb_data_file%';
+-----------------------+------------------------+
| Variable_name        | Value                  |
+-----------------------+------------------------+
| innodb_data_file_path | ibdata1:12M:autoextend |
+-----------------------+------------------------+
1 row in set (0.01 sec)
在my.cnf配置文件的innodb_data_file_path参数里增加一个新的数据文件,选择是否自动扩展启动MySQL
innodb_data_home_dir =
innodb_data_file_path=/ibdata/ibdata1:10M:autoextend
####如果有设置改成,没有设置就添加
innodb_data_home_dir =
innodb_data_file_path = /ibdata/ibdata1:988M;/disk2/ibdata2:50M:autoextend

减小系统表空间大小的方法如下: 
Mysqldump出所有的InnoDB表,包括mysql系统数据库下的五个表

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/1fe1e788fe1712d1b3106819c6ce028f.html