主頁 > 知識庫 > mysql 索引合并的使用

mysql 索引合并的使用

熱門標(biāo)簽:拉卡拉外呼系統(tǒng) 大眾點評星級酒店地圖標(biāo)注 云南電商智能外呼系統(tǒng)價格 智能外呼系統(tǒng)復(fù)位 話務(wù)外呼系統(tǒng)怎么樣 高清地圖標(biāo)注道路 400電話可以辦理嗎 臨清電話機(jī)器人 外東北地圖標(biāo)注

索引合并是mysql底層為我們提供的智能算法。了解索引合并的算法,有助于我們更好的創(chuàng)建索引。

索引合并是通過多個range類型的掃描并且合并它們的結(jié)果集來檢索行的。僅合并來自單個表的索引掃描,而不是跨多個表的索引掃描。合并會產(chǎn)生底層掃描的三種形式:unions(合并)、intersections(交集)、unions-of-intersections(先取交集再合并)。

以下四個例子會產(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án)重AND/OR嵌套的復(fù)雜的WHERE子句而MySQL沒有選擇最佳計劃,那么可以嘗試使用以下的標(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 語句輸出的信息中,索引合并在type列中表現(xiàn)為“index_merge”,在這種情況下,key列包含使用的索引列表。
索引合并訪問方法有幾種算法,表現(xiàn)在 EXPLAIN 語句輸出的Extra字段中:

Using intersect(...)
Using union(...)
Using sort_union(...)

下面將更詳細(xì)地描述這些算法。優(yōu)化器根據(jù)各種可用選項的成本估計,在不同的索引合并算法和其他訪問方法之間進(jìn)行選擇。

Index Merge Intersection算法

Index Merge Intersection算法對所有使用的索引執(zhí)行同步掃描,并生成從合并的索引掃描接收到的行序列的交集。
這種算法適用于當(dāng)WHERE子句被轉(zhuǎn)換成多個使用AND連接的不同索引key上的范圍條件,且條件是以下兩種之一:

一、這種形式的N部分表達(dá)式,索引正好包括N個字段(所有索引字段都被覆蓋),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算法

該算法類似于Index Merge Intersection算法,適用于當(dāng)WHERE子句被轉(zhuǎn)換成多個使用OR連接的不同索引key上的范圍條件,且條件是以下三種之一:

一、這種形式的N部分表達(dá)式,索引正好包括N個字段(所有索引字段都被覆蓋),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)換成多個使用OR連接的不同索引key上的范圍條件,但是不符合 Index Merge Union算法的。Index Merge Sort-Union和Index Merge Union算法的區(qū)別在于,Index Merge Sort-Union必須首先獲取所有行的行id并在返回任何行之前對它們進(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

您可能感興趣的文章:
  • mysql 添加索引 mysql 如何創(chuàng)建索引
  • MySQL索引類型總結(jié)和使用技巧以及注意事項
  • MySQL查看、創(chuàng)建和刪除索引的方法
  • mysql性能優(yōu)化之索引優(yōu)化
  • Mysql索引會失效的幾種情況分析
  • 基于mysql全文索引的深入理解
  • MYSQL中常用的強(qiáng)制性操作(例如強(qiáng)制索引)
  • MySQL 索引分析和優(yōu)化

標(biāo)簽:定西 福州 溫州 揚(yáng)州 無錫 山西 阿里 三明

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《mysql 索引合并的使用》,本文關(guān)鍵詞  mysql,索引,合并,的,使用,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《mysql 索引合并的使用》相關(guān)的同類信息!
  • 本頁收集關(guān)于mysql 索引合并的使用的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章