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官方手册真是个宝藏,有事没事多翻翻吧。

全文完。

推荐搜索关键词列表:


相关文章
|
5天前
|
存储 算法 关系型数据库
InnoDb行格式、数据页结构、索引底层原理和如何建立索引
InnoDb行格式、数据页结构、索引底层原理和如何建立索引
69 0
|
5天前
|
存储 关系型数据库 MySQL
InnoDB一棵B+树可以存放多少行数据?
InnoDB一棵B+树可以存放多少行数据?
44 0
InnoDB一棵B+树可以存放多少行数据?
|
6月前
|
存储 算法 关系型数据库
第21章_InnoDB数据页结构
第21章_InnoDB数据页结构
44 0
|
7月前
|
存储 关系型数据库 MySQL
MySQL使用InnoDB引擎时一张表最大可以储存数据大小为 64TB,那为什么当表中的单行数据达到16KB时,这张表只能储存一条数据?
MySQL使用InnoDB引擎时一张表最大可以储存数据大小为 64TB,那为什么当表中的单行数据达到16KB时,这张表只能储存一条数据?
|
8月前
|
存储 关系型数据库 MySQL
第5章 【MySQL】InnoDB数据页结构
第5章 【MySQL】InnoDB数据页结构
47 0
|
12月前
|
存储 算法 关系型数据库
一文带你了解MySQL之InnoDB 数据页结构
学完了记录结构,我们该学数据页的结构,前边我们简单的提了一下页的概念,它是Innodb管理存储空间的基本单位,页的大小默认16KB,InnoDB为了不同的目的而设计了许多种不同类型的页,比如存放表空间头部信息的页,存放Insert Buffer信息的页,存放INODE信息的页,存放undo日志信息的页等等等等。而我们聚焦的是那些存放我们表中记录的那种类型的页,官方称这种存放记录的页为索引(INDEX)页,鉴于我们还没有了解过索引是个什么东系,而这些表中的记录就是我们日常口中所称的数据,所以目前还是叫这种存放记录的页为数据页吧
333 0
|
SQL 监控 关系型数据库
InnoDB数据页什么时候合并(2)
InnoDB数据页什么时候合并
|
存储 SQL 关系型数据库
InnoDB数据页什么时候合并(1)
InnoDB数据页什么时候合并
|
存储 关系型数据库 MySQL
【Mysql】InnoDB 引擎中的数据页结构
【Mysql】InnoDB 引擎中的数据页结构
【Mysql】InnoDB 引擎中的数据页结构
|
存储 关系型数据库 MySQL
InnoDB(7)数据持久化 --mysql从入门到精通(十二)
InnoDB(7)数据持久化 --mysql从入门到精通(十二)