InnoDB数据页什么时候合并(2)

简介: InnoDB数据页什么时候合并

3.1 除了表级可以设置外,单个索引也可以设置合并阈值

对InnoDB来说,其实整个表都是索引页,无非是聚集索引页还是辅助索引页而已。

因此,页合并阈值既可以用于聚集索引页,也可以用于辅助索引页。

只需要在创建索引时指定即可:

[root@yejr.run]> ALTER TABLE t_sk ADD INDEX k1(c1) COMMENT 'MERGE_THRESHOLD=20';


当然了,这个只能在创建索引时一次性指定,不能中途修改。

然而,表级别的合并阈值则可以在运行时修改:

[root@yejr.run]> ALTER TABLE t_sk COMMENT 'MERGE_THRESHOLD=40';
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

还可以通过查看元数据确认各个索引的合并阈值设置:

# 直接根据 TABLE_ID 条件查询聚集索引和辅助索引
# 如果辅助索引创建时没设置阈值,则其阈值设置直接从表级设置中继承
# 提醒:8.0中 INNODB_SYS_INDEXES 表名变成了 INNODB_INDEXES
[root@yejr.run]> SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES WHERE select * from information_schema.innodb_sys_Indexes where TABLE_ID = 66\G
*************************** 1. row ***************************
       INDEX_ID: 54
           NAME: PRIMARY  --聚集索引
       TABLE_ID: 66
           TYPE: 3
       N_FIELDS: 1
        PAGE_NO: 3
          SPACE: 31
MERGE_THRESHOLD: 30
*************************** 2. row ***************************
       INDEX_ID: 65
           NAME: k1  --聚集索引
       TABLE_ID: 66
           TYPE: 0
       N_FIELDS: 1
        PAGE_NO: 8
          SPACE: 31
MERGE_THRESHOLD: 20  --自行设定阈值为20%
# 或者执行SHOW语法
[root@yejr.run]> SHOW INDEX FROM t_sk\G
*************************** 1. row ***************************
        Table: t_sk
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 494750
     Sub_part: NULL
       Packed: NULL
         Null:
   Index_type: BTREE
      Comment:
Index_comment:
*************************** 2. row ***************************
        Table: t_sk
   Non_unique: 1
     Key_name: k1
 Seq_in_index: 1
  Column_name: c1
    Collation: A
  Cardinality: 451839
     Sub_part: NULL
       Packed: NULL
         Null:
   Index_type: BTREE
      Comment:
Index_comment: MERGE_THRESHOLD=20



3.2 页合并状态监控

页合并的统计情况,可以通过查询 INNODB_METRICS 表获取到。

# 先启用该metric
[root@yejr.run]> set global innodb_monitor_enable="module_index";
Query OK, 0 rows affected (0.00 sec)
# 一顿删除操作猛如虎出发页合并之后查询
[root@yejr.run]> SELECT NAME,COUNT,STATUS,COMMENT from INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME LIKE 'index_page%merge%';
+-----------------------------+-------+---------+----------------------------------------+
| NAME                        | COUNT | STATUS  | COMMENT                                |
+-----------------------------+-------+---------+----------------------------------------+
| index_page_merge_attempts   |    13 | enabled | Number of index page merge attempts    |
| index_page_merge_successful |     1 | enabled | Number of successful index page merges |
+-----------------------------+-------+---------+----------------------------------------+

通过监控这个metric,如果发现页合并非常频繁的话,可以考虑把 MERGE_THRESHOLD 阈值调低。但是设置太低也有风险,因为合并频率降低了,结果会导致更高的数据页碎片率。


3.3 如何适当调整阈值设置

有个不便的地方是,阈值 MERGE_THRESHOLD 无法全局设定(innodb_merge_threshold_set_all_debug参数只能用于debug版本,正常版本不可设置),而且通过 INNODB_METRICS 也无法监控到具体是哪些表上的合并操作最多。因此当发现有很高合并频率时,可能需要扫描所有表,找到那些碎片率较高的表,其产生合并的"嫌疑"应该也较高。

页分裂、合并是个平衡的艺术,如果表DDL设计的好,每条记录的长度基本上一致的话,并且没有频繁的变长更新或删除,那页合并的次数应该不会太高才对。


延伸阅读

Enjoy MySQL :)

最后多啰嗦一句,MySQL官方手册真是个宝藏,有事没事多翻翻吧。

全文完。

推荐搜索关键词列表:


相关文章
|
8月前
|
存储 算法 关系型数据库
InnoDb行格式、数据页结构、索引底层原理和如何建立索引
InnoDb行格式、数据页结构、索引底层原理和如何建立索引
127 0
|
2月前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
160 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
6月前
|
关系型数据库 数据库 存储
顺序读和InnoDB的数据组织
【7月更文挑战第7天】自增主键优化顺序读:保证数据物理排序,提升范围查询效率。InnoDB引擎中,主键决定数据在页的存储。当插入的数据引起页分裂,如从1、2、3、5、6、7插入4,会导致相邻逻辑页在磁盘上可能分散,影响性能。了解页结构深化数据库知识,面试时可根据情况深入讨论。
40 2
|
7月前
|
存储 算法 关系型数据库
【MySQL技术内幕】4.4-InnoDB数据页结构
【MySQL技术内幕】4.4-InnoDB数据页结构
134 1
|
8月前
|
存储 关系型数据库 MySQL
InnoDB一棵B+树可以存放多少行数据?
InnoDB一棵B+树可以存放多少行数据?
84 0
InnoDB一棵B+树可以存放多少行数据?
|
存储 算法 关系型数据库
第21章_InnoDB数据页结构
第21章_InnoDB数据页结构
70 0
|
存储 关系型数据库 MySQL
MySQL使用InnoDB引擎时一张表最大可以储存数据大小为 64TB,那为什么当表中的单行数据达到16KB时,这张表只能储存一条数据?
MySQL使用InnoDB引擎时一张表最大可以储存数据大小为 64TB,那为什么当表中的单行数据达到16KB时,这张表只能储存一条数据?
195 0
|
存储 关系型数据库 MySQL
第5章 【MySQL】InnoDB数据页结构
第5章 【MySQL】InnoDB数据页结构
98 0
|
存储 算法 关系型数据库
一文带你了解MySQL之InnoDB 数据页结构
学完了记录结构,我们该学数据页的结构,前边我们简单的提了一下页的概念,它是Innodb管理存储空间的基本单位,页的大小默认16KB,InnoDB为了不同的目的而设计了许多种不同类型的页,比如存放表空间头部信息的页,存放Insert Buffer信息的页,存放INODE信息的页,存放undo日志信息的页等等等等。而我们聚焦的是那些存放我们表中记录的那种类型的页,官方称这种存放记录的页为索引(INDEX)页,鉴于我们还没有了解过索引是个什么东系,而这些表中的记录就是我们日常口中所称的数据,所以目前还是叫这种存放记录的页为数据页吧
754 0
|
存储 机器学习/深度学习 算法
一文带你了解MySQL之InnoDB统计数据是如何收集的
我们前边唠叨查询成本的时候经常用到一些统计数据,比如通过show table status可以看到关于表的统计数据,通过show index可以看到关于索引的统计数据,那么这些统计数据是怎么来的呢?它们是以什么方式收集的呢?本章将聚焦于InnoDB存储引擎的统计数据收集策略,看完本章后家就会明白为啥前边老说InnoDB的统计信息是不精确的估计值了
604 0