mysql 索引合并的使用
索引合并是mysql底層為我們提供的智能算法。了解索引合并的算法,有助于我們更好的創(chuàng)建索引。
索引合并是通過(guò)多個(gè)range類(lèi)型的掃描并且合并它們的結(jié)果集來(lái)檢索行的。僅合并來(lái)自單個(gè)表的索引掃描,而不是跨多個(gè)表的索引掃描。合并會(huì)產(chǎn)生底層掃描的三種形式:unions(合并)、intersections(交集)、unions-of-intersections(先取交集再合并)。
以下四個(gè)例子會(huì)產(chǎn)生索引合并:
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、如果查詢語(yǔ)句包含一個(gè)帶有嚴(yán)重AND/OR嵌套的復(fù)雜的WHERE子句而MySQL沒(méi)有選擇最佳計(jì)劃,那么可以嘗試使用以下的標(biāo)志符轉(zhuǎn)換:
(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 語(yǔ)句輸出的信息中,索引合并在type列中表現(xiàn)為“index_merge”,在這種情況下,key列包含使用的索引列表。
索引合并訪問(wèn)方法有幾種算法,表現(xiàn)在 EXPLAIN 語(yǔ)句輸出的Extra字段中:
Using intersect(...) Using union(...) Using sort_union(...)
下面將更詳細(xì)地描述這些算法。優(yōu)化器根據(jù)各種可用選項(xiàng)的成本估計(jì),在不同的索引合并算法和其他訪問(wèn)方法之間進(jìn)行選擇。
Index Merge Intersection算法
Index Merge Intersection算法對(duì)所有使用的索引執(zhí)行同步掃描,并生成從合并的索引掃描接收到的行序列的交集。
這種算法適用于當(dāng)WHERE子句被轉(zhuǎn)換成多個(gè)使用AND連接的不同索引key上的范圍條件,且條件是以下兩種之一:
一、這種形式的N部分表達(dá)式,索引正好包括N個(gè)字段(所有索引字段都被覆蓋),N>=1,N如果大于1就是復(fù)合索引:
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算法
該算法類(lèi)似于Index Merge Intersection算法,適用于當(dāng)WHERE子句被轉(zhuǎn)換成多個(gè)使用OR連接的不同索引key上的范圍條件,且條件是以下三種之一:
一、這種形式的N部分表達(dá)式,索引正好包括N個(gè)字段(所有索引字段都被覆蓋),N>=1,N如果大于1就是復(fù)合索引:
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算法
該算法適用于當(dāng)WHERE子句被轉(zhuǎn)換成多個(gè)使用OR連接的不同索引key上的范圍條件,但是不符合 Index Merge Union算法的。Index Merge Sort-Union和Index Merge Union算法的區(qū)別在于,Index Merge Sort-Union必須首先獲取所有行的行id并在返回任何行之前對(duì)它們進(jìn)行排序。
例子:
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;
到此這篇關(guān)于mysql 索引合并的使用的文章就介紹到這了,更多相關(guān)mysql 索引合并內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql語(yǔ)法時(shí)采用了雙引號(hào)““的錯(cuò)誤問(wèn)題
錯(cuò)誤原因:使用雙引號(hào)定義表名和列名導(dǎo)致MySQL報(bào)錯(cuò),應(yīng)使用反引號(hào),修改方案:將雙引號(hào)改為反引號(hào),避免語(yǔ)法沖突,總結(jié):在MySQL中,正確使用反引號(hào)引用標(biāo)識(shí)符,確保SQL語(yǔ)句符合MySQL語(yǔ)法規(guī)則2024-10-10navicat?連接Ubuntu虛擬機(jī)的mysql的操作方法
這篇文章主要介紹了navicat?連接Ubuntu虛擬機(jī)的mysql的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04安裝mysql 8.0.17并配置遠(yuǎn)程訪問(wèn)的方法
這篇文章主要介紹了安裝mysql 8.0.17并配置遠(yuǎn)程訪問(wèn)的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10Mysql如何查詢字符串開(kāi)頭的數(shù)據(jù)
這篇文章主要介紹了Mysql如何查詢字符串開(kāi)頭的數(shù)據(jù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07MySQL核心參數(shù)優(yōu)化文件my.ini實(shí)現(xiàn)
本文主要介紹了MySQL核心參數(shù)優(yōu)化文件my.ini實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01