mysql 索引合併
導讀 | 索引合併是mysql底層為我們提供的智慧演算法。本文就介紹了mysql 索引合併的使用,文中透過示例程式碼介紹的非常詳細,具有一定的參考價值,感興趣的小夥伴們可以參考一下 |
索引合併是mysql底層為我們提供的智慧演算法。瞭解索引合併的演算法,有助於我們更好的建立索引。
索引合併是透過多個range型別的掃描並且合併它們的結果集來檢索行的。僅合併來自單個表的索引掃描,而不是跨多個表的索引掃描。合併會產生底層掃描的三種形式:unions(合併)、intersections(交集)、unions-of-intersections(先取交集再合併)。
以下四個例子會產生索引合併:
SELECT * FROM tbl_name WHERE key1 = 10 OR key2 = 20; SELECT * FROM tbl_name WHERE (key1 = 10 OR key2 = 20) AND non_key = 30; SELECT * FROM t1, t2 WHERE (t1.key1 IN (1,2) OR t1.key2 LIKE 'value%') AND t2.key1 = t1.some_col; SELECT * FROM t1, t2 WHERE t1.key1 = 1 AND (t2.key1 = t1.some_col OR t2.key2 = t1.some_col2);
1、如果查詢語句包含一個帶有嚴重AND/OR巢狀的複雜的WHERE子句而MySQL沒有選擇最佳計劃,那麼可以嘗試使用以下的標誌符轉換:
(x AND y) OR z => (x OR z) AND (y OR z) (x OR y) AND z => (x AND z) OR (y AND z)
2、索引合併不適用於全文索引。
在 EXPLAIN 語句輸出的資訊中,索引合併在type列中表現為“index_merge”,在這種情況下,key列包含使用的索引列表。
索引合併訪問方法有幾種演算法,表現在 EXPLAIN 語句輸出的Extra欄位中:
Using intersect(...) Using union(...) Using sort_union(...)
下面將更詳細地描述這些演算法。最佳化器根據各種可用選項的成本估計,在不同的索引合併演算法和其他訪問方法之間進行選擇。
Index Merge Intersection演算法
Index Merge Intersection演算法對所有使用的索引執行同步掃描,並生成從合併的索引掃描接收到的行序列的交集。
這種演算法適用於當WHERE子句被轉換成多個使用AND連線的不同索引key上的範圍條件,且條件是以下兩種之一:
一、這種形式的N部分表示式,索引正好包括N個欄位(所有索引欄位都被覆蓋),N>=1,N如果大於1就是複合索引:
key_part1 = const1 AND key_part2 = const2 ... AND key_partN = constN。
二、InnoDB表主鍵上的任何範圍條件。
例子:
SELECT * FROM innodb_table WHERE primary_key < 10 AND key_col1 = 20; SELECT * FROM tbl_name WHERE key1_part1 = 1 AND key1_part2 = 2 AND key2 = 2;
Index Merge Union演算法
該演算法類似於Index Merge Intersection演算法,適用於當WHERE子句被轉換成多個使用OR連線的不同索引key上的範圍條件,且條件是以下三種之一:
一、這種形式的N部分表示式,索引正好包括N個欄位(所有索引欄位都被覆蓋),N>=1,N如果大於1就是複合索引:
key_part1 = const1 AND key_part2 = const2 ... AND key_partN = constN。
二、InnoDB表主鍵上的任何範圍條件。
三、符合Index Merge Intersection演算法的條件。
例子:
SELECT * FROM t1 WHERE key1 = 1 OR key2 = 2 OR key3 = 3; SELECT * FROM innodb_table WHERE (key1 = 1 AND key2 = 2) OR (key3 = 'foo' AND key4 = 'bar') AND key5 = 5;
Index Merge Sort-Union演算法
該演算法適用於當WHERE子句被轉換成多個使用OR連線的不同索引key上的範圍條件,但是不符合 Index Merge Union演算法的。Index Merge Sort-Union和Index Merge Union演算法的區別在於,Index Merge Sort-Union必須首先獲取所有行的行id並在返回任何行之前對它們進行排序。
例子:
SELECT * FROM tbl_name WHERE key_col1 < 10 OR key_col2 < 20; SELECT * FROM tbl_name WHERE (key_col1 > 10 OR key_col2 = 20) AND nonkey_col = 30;
到此這篇關於mysql 索引合併的使用的文章就介紹到這了
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2791545/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL 配置索引頁的合併閾值MySql索引
- MySQL 優化之 index_merge (索引合併)MySql優化Index索引
- MySQL中為什麼要使用索引合併(Index Merge)?MySql索引Index
- MySQL複合索引MySql索引
- mysql組合索引,abc索引命中MySql索引
- 12.索引合併-indexMerge索引Index
- MySQL的聯合索引MySql索引
- mysql的組合索引MySql索引
- MySQL複合索引探究MySql索引
- MySQL 組合索引不生效MySql索引
- 關於numpy的索引、合併、分割索引
- 【Mysql】InnoDB 中的聚簇索引、二級索引、聯合索引MySql索引
- MySQL學習筆記:組合索引-索引下推MySql筆記索引
- 【MySQL】MySQL如何合併多行資料,行轉列,group_concat 多行合併MySql
- mysql 建立和刪除聯合索引MySql索引
- MySQL的index merge(索引合併)導致資料庫死鎖分析與解決方案MySqlIndex索引資料庫
- PostgreSQL11preview-索引優化。filter智慧消除、分割槽索引智慧合併SQLView索引優化Filter
- MySQL組合索引和最左匹配原則MySql索引
- mysql 聯合索引的兩種特殊場景MySql索引
- MySQL學習筆記:組合索引-最左原則MySql筆記索引
- Mysql中聯合索引的最左匹配原則MySql索引
- MySQL 調優之如何正確使用聯合索引MySql索引
- MySQL 合併查詢union 查詢出的行合併到一個表中MySql
- mysql索引之字首索引MySql索引
- ElasticSearch 索引 VS MySQL 索引Elasticsearch索引MySql
- Hbase-原理-region合併和hfile的合併(大合併、小合併)
- mysql索引MySql索引
- [Mysql]索引MySql索引
- MySQL 索引MySql索引
- MySQL — 索引MySql索引
- MySQL 合併查詢join 查詢出的不同列合併到一個表中MySql
- MySQL建立表的時候建立聯合索引的方法MySql索引
- 為什麼ElasticSearch比MySQL更適合全文索引ElasticsearchMySql索引
- MySQL索引系列:全文索引MySql索引
- MySQL 字串索引和字首索引MySql字串索引
- 索引與null(二):組合索引索引Null
- MySQL 索引初探MySql索引
- Mysql索引使用MySql索引