MySQL 配置索引頁的合併閾值
配置索引頁的合併閾值
您可以為索引頁配置MERGE_THRESHOLD值。如果一個索引頁的“page-full”百分比低於MERGE_THRESHOLD值,當一個行被刪除或當一個行被UPDATE 操作縮短時,InnoDB會嘗試合併這個索引頁和相鄰的索引頁。預設的MERGE_THRESHOLD值是50,這是以前的硬編碼值。MERGE_THRESHOLD最小值為1,最大值為50。
當索引頁的頁滿百分比低於50%(預設的MERGE_THRESHOLD設定)時,InnoDB會嘗試將索引頁與相鄰頁合併。如果兩個頁面都接近50%的滿,那麼在頁面合併後不久就會發生頁面分割。如果頻繁發生這種合併-分割行為,則會對效能產生不利影響。為了避免頻繁的合併分割,你可以降低MERGE_THRESHOLD值,這樣InnoDB嘗試頁面合併的百分比就會降低。以較低的頁滿百分比合並頁面會在索引頁中留下更多的空間,並有助於減少合併-分割行為。
可以為一個表或單個索引定義索引頁的MERGE_THRESHOLD。為單個索引定義的MERGE_THRESHOLD值優先於為表定義的MERGE_THRESHOLD值。如果未定義,MERGE_THRESHOLD值預設為50。
設定表的MERGE_THRESHOLD
可以使用CREATE TABLE語句的table_option COMMENT子句為一個表設定MERGE_THRESHOLD值。例如:
CREATE TABLE t1 ( id INT, KEY id_index (id) ) COMMENT='MERGE_THRESHOLD=45';
還可以使用ALTER TABLE的table_option COMMENT子句為現有表設定MERGE_THRESHOLD值
CREATE TABLE t1 ( id INT, KEY id_index (id) ); ALTER TABLE t1 COMMENT='MERGE_THRESHOLD=40';
為單個索引設定MERGE_THRESHOLD
要為單個索引設定MERGE_THRESHOLD值,可以使用帶有CREATE TABLE、ALTER TABLE或CREATE INDEX的index_option COMMENT子句,如下面的示例所示:
.使用CREATE TABLE為單個索引設定MERGE_THRESHOLD:
mysql> CREATE TABLE t1 ( -> id INT, -> KEY id_index (id) COMMENT 'MERGE_THRESHOLD=40' -> ); Query OK, 0 rows affected (0.11 sec)
.使用ALTER TABLE為單個索引設定MERGE_THRESHOLD:
mysql> CREATE TABLE t1 ( -> id INT, -> KEY id_index (id) -> ); ALTER TABLE t1 DROP KEY id_index; ALTER TABLE t1 ADD KEY id_index (id) COMMENT 'MERGE_THRESHOLD=40';Query OK, 0 rows affected (0.17 sec) mysql> ALTER TABLE t1 DROP KEY id_index; Query OK, 0 rows affected (0.05 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> ALTER TABLE t1 ADD KEY id_index (id) COMMENT 'MERGE_THRESHOLD=40'; Query OK, 0 rows affected (0.09 sec) Records: 0 Duplicates: 0 Warnings: 0
使用CREATE INDEX為單個索引設定MERGE_THRESHOLD:
mysql> CREATE TABLE t1 (id INT); Query OK, 0 rows affected (0.14 sec) mysql> CREATE INDEX id_index ON t1 (id) COMMENT 'MERGE_THRESHOLD=40'; Query OK, 0 rows affected (0.11 sec) Records: 0 Duplicates: 0 Warnings: 0
不能在索引級別修改GEN_CLUST_INDEX的MERGE_THRESHOLD值,GEN_CLUST_INDEX是InnoDB在建立InnoDB表時,在沒有主鍵或唯一鍵索引的情況下建立的聚集索引。只能透過設定表的MERGE_THRESHOLD來修改GEN_CLUST_INDEX的MERGE_THRESHOLD值
查詢索引的MERGE_THRESHOLD值
當前索引的MERGE_THRESHOLD值可以透過查詢INNODB_SYS_INDEXES表獲得。例如:
mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES WHERE NAME='id_index' \G *************************** 1. row *************************** INDEX_ID: 265 NAME: id_index TABLE_ID: 267 TYPE: 0 N_FIELDS: 1 PAGE_NO: 4 SPACE: 269 MERGE_THRESHOLD: 40 1 row in set (0.00 sec)
如果使用table_option COMMENT子句顯式定義,可以使用SHOW CREATE TABLE檢視錶的MERGE_THRESHOLD值
mysql> SHOW CREATE TABLE t1 \G *************************** 1. row *************************** Table: t1 Create Table: CREATE TABLE `t1` ( `id` int(11) DEFAULT NULL, KEY `id_index` (`id`) COMMENT 'MERGE_THRESHOLD=40' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 1 row in set (0.00 sec)
在索引級別定義的MERGE_THRESHOLD值優先於為表定義的MERGE_THRESHOLD值。如果未定義,MERGE_THRESHOLD預設為50% (MERGE_THRESHOLD=50,這是以前的硬編碼值。
同樣,如果使用index_option COMMENT子句顯式地定義,也可以使用SHOW INDEX檢視索引的MERGE_THRESHOLD值:
mysql> show index from t1 \G *************************** 1. row *************************** Table: t1 Non_unique: 1 Key_name: id_index Seq_in_index: 1 Column_name: id Collation: A Cardinality: 0 Sub_part: NULL Packed: NULL Null: YES Index_type: BTREE Comment: Index_comment: MERGE_THRESHOLD=40 1 row in set (0.00 sec)
測量MERGE_THRESHOLD設定的效果:
INNODB_METRICS表提供了兩個計數器,可以用來衡量MERGE_THRESHOLD設定對索引頁合併的影響。
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 | +-----------------------------+----------------------------------------+ 2 rows in set (0.00 sec)
當降低MERGE_THRESHOLD值時,目標是:
.頁面合併嘗試和成功合併的次數更少
.嘗試合併和成功合併頁面的次數相同
太小的MERGE_THRESHOLD設定由於大量的空頁面空間導致大量的資料檔案。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26015009/viewspace-2871762/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql 索引合併MySql索引
- mysql索引合併:一條sql可以使用多個索引MySql索引
- “閥值”與“閾值”的區別
- MySQL 優化之 index_merge (索引合併)MySql優化Index索引
- MySQL的聯合索引MySql索引
- mysql的組合索引MySql索引
- index merge合併索引Index索引
- Oracle索引合併coalesce操作Oracle索引
- MySQL複合索引MySql索引
- MySQL中為什麼要使用索引合併(Index Merge)?MySql索引Index
- mysql組合索引,abc索引命中MySql索引
- 12.索引合併-indexMerge索引Index
- 機器學習之分類:指定閾值機器學習
- 閾值PSI程式碼
- OpenCV(iOS)閾值化(15)OpenCViOS
- MySQL複合索引探究MySql索引
- MySQL建立複合索引MySql索引
- 【Mysql】InnoDB 中的聚簇索引、二級索引、聯合索引MySql索引
- MySQL單列索引和組合索引的區別MySql索引
- Mysql索引的使用-組合索引+跳躍條件MySql索引
- 迭代閾值分割演算法演算法
- mysql聯合索引的選擇性MySql索引
- MySQL 組合索引不生效MySql索引
- python OpenCV中的閾值是什麼PythonOpenCV
- openCV中的影像處理 3 影像閾值OpenCV
- 網格缺陷檢測(二值化閾值分析)
- 閾值分割及 threshold 實現
- Mysql索引的使用 - 組合索引 + 範圍條件的處理MySql索引
- MySQL單列索引和組合索引的區別介紹MySql索引
- MySQL 聯合索引測試3MySql索引
- mysql大頁配置MySql
- MySQL學習筆記:組合索引-索引下推MySql筆記索引
- 【MySQL】MySQL如何合併多行資料,行轉列,group_concat 多行合併MySql
- 合併陣列物件中相同的屬性值陣列物件
- 雙閾值對抗資料抖動
- Mysql中聯合索引的最左匹配原則MySql索引
- mysql 聯合索引的兩種特殊場景MySql索引
- MySQL的index merge(索引合併)導致資料庫死鎖分析與解決方案MySqlIndex索引資料庫