0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

什么是索引合優(yōu)化?探究一下索引合并的幾種情況

dyquk4xk2p3d ? 來(lái)源:后端開(kāi)發(fā)技術(shù) ? 2023-09-26 09:14 ? 次閱讀

什么是索引合優(yōu)化

在使用 explain 命令分析 SQL 執(zhí)行情況的時(shí)候,type列會(huì)描述了表如何被連接,這個(gè)列的內(nèi)容直接反映了 SQL 執(zhí)行的效率。當(dāng)里面的內(nèi)容展示為 index_merge時(shí)表示使用了索引合并優(yōu)化,在這種情況下輸出行中的key列包含具體使用的索引。

a216de48-5bfc-11ee-939d-92fbcf53809c.png

MySQL 的索引合并優(yōu)化是一種查詢優(yōu)化技術(shù),它利用多個(gè)索引來(lái)加速查詢的執(zhí)行。當(dāng)一個(gè)查詢中包含多個(gè)條件,并且這些條件分別適用于不同的索引時(shí),MySQL 可以將這些索引合并起來(lái)使用,減少了回表的次數(shù),以加速查詢的執(zhí)行。

簡(jiǎn)單來(lái)說(shuō)過(guò)程是這樣:

查詢條件同時(shí)包含 index1 和 index2。

在根據(jù) index1 和 index2 查詢到主鍵后并沒(méi)有直接分別去聚簇索引中查詢,而是先對(duì)他們查到的主鍵做處理,合并到一起。

根據(jù)處理后的主鍵去聚簇索引執(zhí)行查詢,只需一次回表就可以拿到結(jié)果。

a222e6d4-5bfc-11ee-939d-92fbcf53809c.png

下面我們探究一下索引合并的幾種情況。

準(zhǔn)備

我們使用如下數(shù)據(jù)做測(cè)試,并且建立了三個(gè)索引。

CREATETABLE`test_table`(
`id`bigint(20)NOTNULLAUTO_INCREMENT,
`user_id`bigint(20)NOTNULL,
`name`varchar(255)DEFAULT'',
`merchant_id`bigint(20)NOTNULL,
`area`int(11)DEFAULTNULL,
PRIMARYKEY(`id`),
UNIQUEKEY`uq_user_id`(`user_id`)USINGBTREE,
KEY`idx_merchant_id`(`merchant_id`)USINGBTREE,
KEY`idx_area`(`area`)USINGBTREE
)ENGINE=InnoDBAUTO_INCREMENT=410DEFAULTCHARSET=utf8mb4

在表中,我初始化了 100 多條數(shù)據(jù)用于測(cè)試。

基本用法

Index Merge 通過(guò)多次 range掃描檢索行并將它們的結(jié)果合并為一個(gè)。僅限合并來(lái)自單個(gè)表的索引掃描,而不是跨多個(gè)表的掃描。合并可以產(chǎn)生其底層掃描的并集、交集或交集并集,所以產(chǎn)生了三種算法。

可以使用索引合并的示例查詢:

SELECT*FROMtest_tableWHEREmerchant_id=3ORarea=3;

SELECT*FROMtest_tableWHERE(merchant_id=3ORarea=3)ANDname='daniel';

SELECT*FROMt1,t2
WHERE(t1.key1IN(1,2)ORt1.key2LIKE'value%')
ANDt2.key1=t1.some_col;

SELECT*FROMt1,t2
WHEREt1.key1=1
AND(t2.key1=t1.some_colORt2.key2=t1.some_col2);

索引合并優(yōu)化算法注意事項(xiàng)如下

1、如果您的查詢有一個(gè)復(fù)雜的WHERE 子句,帶有深度 AND/OR 嵌套,而 MySQL 沒(méi)有選擇最佳執(zhí)行計(jì)劃,請(qǐng)嘗試使用以下恒等變換。

(xANDy)ORz=>(xORz)AND(yORz)
(xORy)ANDz=>(xANDz)OR(yANDz)

2、Index Merge 不適用于全文索引。

三種算法

Index Merge 訪問(wèn)方法有幾種算法,顯示在輸出Extra字段 中EXPLAIN:

交集算法Using intersect(...)

并集算法 Using union(...)

排序并集算法Using sort_union(...)

下面我們?cè)敿?xì)介紹這些算法,優(yōu)化器根據(jù)各種可用選項(xiàng)的成本估算,在不同的索引合并算法之間進(jìn)行選擇。

Index Merge 的使用受制于 系統(tǒng)變量的index_merge、 index_merge_intersection、 index_merge_union和 index_merge_sort_unionflags 的值optimizer_switch 。默認(rèn)情況下,所有這些標(biāo)志都是on. 要僅啟用某些算法,請(qǐng)?jiān)O(shè)置index_merge 為off,并僅啟用應(yīng)允許的其他算法。

1.交集算法

當(dāng)查詢條件是多個(gè)查詢的時(shí)候,并且條件用 and 關(guān)聯(lián),這種情況會(huì)使用交集(intersect)算法,滿足以下條件之一都可以。

這種形式的 -part 表達(dá)式*N*,其中索引具有精確的 *N*部分(即,所有索引部分都被覆蓋):

key_part1=const1ANDkey_part2=const2...ANDkey_partN=constN
a22bcce0-5bfc-11ee-939d-92fbcf53809c.png

InnoDB 引擎下使用主鍵范圍條件查詢。如果其中一個(gè) merge 條件是對(duì)表主鍵的范圍查詢,則它不用于行檢索,而是用于過(guò)濾掉使用其他條件檢索的行。

explainselect*fromtest_tablewhereid
a23ccf40-5bfc-11ee-939d-92fbcf53809c.png

索引合并交集算法對(duì)所有使用的索引執(zhí)行同時(shí)掃描,并生成它從合并索引掃描中接收到的主鍵的交集。如果查詢中使用的所有列都被使用的索引覆蓋,則不會(huì)檢索完整的表行(具體使用的算法輸出在 Extra 字段中)。

2.并集算法

并集(union)算法適用于將表的WHERE 子句轉(zhuǎn)換為不同索引列組合的多個(gè)范圍條件,并且使用OR關(guān)聯(lián),且每個(gè)條件為以下之一:

不同普通索引列使用 or 關(guān)聯(lián)

key_part1=const1ORkey_part2=const2...ORkey_partN=constN

InnoDB引擎下主鍵使用范圍查詢

例子:

explainselect*fromtest_tablewheremerchant_id=3orarea=3;
a244602a-5bfc-11ee-939d-92fbcf53809c.png

3.排序并集算法

排序并集(sort_union)算法適用于由 or 關(guān)鍵詞組合的多個(gè)范圍查詢。

例子:

explainselect*fromtest_tablewheremerchant_id

sort-union 算法和 union 算法之間的區(qū)別在于,sort-union 算法必須首先獲取所有行的行 ID ,然后在回表之前它們進(jìn)行排序。

a247fb22-5bfc-11ee-939d-92fbcf53809c.png








審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • SQL
    SQL
    +關(guān)注

    關(guān)注

    1

    文章

    750

    瀏覽量

    43900
  • MYSQL數(shù)據(jù)庫(kù)

    關(guān)注

    0

    文章

    95

    瀏覽量

    9347

原文標(biāo)題:面試官:會(huì)SQL調(diào)優(yōu),那你知道索引合并嗎?

文章出處:【微信號(hào):良許Linux,微信公眾號(hào):良許Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何利用Flood多維索引技術(shù)實(shí)現(xiàn)優(yōu)化數(shù)據(jù)存儲(chǔ)布局

    R-Trees,Z-ordering等,然而這些索引結(jié)構(gòu)在不同的數(shù)據(jù)集以及查詢集合(query workload)很難進(jìn)行統(tǒng)優(yōu)化。在本篇論文中,提出了名為Flood的多維學(xué)習(xí)
    的頭像 發(fā)表于 09-22 16:38 ?3699次閱讀
    如何利用Flood多維<b class='flag-5'>索引</b>技術(shù)實(shí)現(xiàn)<b class='flag-5'>優(yōu)化</b>數(shù)據(jù)存儲(chǔ)布局

    基于索引的SQL語(yǔ)句優(yōu)化之降龍十八掌

    使用全表掃描還是使用索引和所有的秘笈樣,最后招都會(huì)又回到起點(diǎn),最后我們來(lái)討論一下是否需要建立索引,也許進(jìn)行全表掃描更快。在大多數(shù)
    發(fā)表于 09-25 13:24

    LV Nugget之?dāng)?shù)組索引的妙用

    數(shù)組元素。下圖所示的例子在初學(xué)者編程中經(jīng)常遇到,這是我最近遇到初學(xué)者的用法。上述操作使用個(gè)索引數(shù)組函數(shù)即可以實(shí)現(xiàn),如下圖所示。如果索引數(shù)組函數(shù)的索引端子不連接,首個(gè)
    發(fā)表于 11-16 13:50

    LabVIEW Nugget之?dāng)?shù)組索引的妙用

    數(shù)組元素。下圖所示的例子在初學(xué)者編程中經(jīng)常遇到,這是我最近遇到初學(xué)者的用法。上述操作使用個(gè)索引數(shù)組函數(shù)即可以實(shí)現(xiàn),如下圖所示。如果索引數(shù)組函數(shù)的索引端子不連接,首個(gè)
    發(fā)表于 12-18 15:02

    求各位大神指點(diǎn)一下,關(guān)于自動(dòng)索引

    請(qǐng)各位大神指點(diǎn)一下怎么關(guān)閉labview2015 for循環(huán)中的”自動(dòng)索引“,我右擊那個(gè)左邊框上面的小方框,沒(méi)有關(guān)閉選項(xiàng)
    發(fā)表于 05-21 01:12

    Mysql優(yōu)化選擇最佳索引規(guī)則

    索引的目的在于提高查詢效率,其功能可類比字典,通過(guò)該索引可以查詢到我們想要查詢的信息,因此,選擇建立好的索引十分重要,以下是為Mysql優(yōu)化選擇最佳
    發(fā)表于 07-06 15:13

    MySQL索引使用優(yōu)化和規(guī)范

    MySQL - 索引使用優(yōu)化和規(guī)范
    發(fā)表于 06-15 16:01

    MySQL索引的使用問(wèn)題

    、前言 在MySQL中進(jìn)行SQL優(yōu)化的時(shí)候,經(jīng)常會(huì)在情況下,對(duì)MySQL能否利用索引
    的頭像 發(fā)表于 01-06 16:13 ?1532次閱讀

    一百道關(guān)于MySQL索引解答

    數(shù)據(jù)庫(kù) 1. MySQL索引使用有哪些注意事項(xiàng)呢? 可以從三個(gè)維度回答這個(gè)問(wèn)題:索引哪些情況會(huì)失效,索引不適合哪些場(chǎng)景,索引規(guī)則
    的頭像 發(fā)表于 06-13 15:51 ?2009次閱讀

    數(shù)據(jù)庫(kù)索引使用策略及優(yōu)化

    索引使用策略及優(yōu)化 MySQL的優(yōu)化主要分為結(jié)構(gòu)優(yōu)化(Scheme optimization)和查詢優(yōu)化(Query optimizatio
    的頭像 發(fā)表于 11-02 15:13 ?1604次閱讀
    數(shù)據(jù)庫(kù)<b class='flag-5'>索引</b>使用策略及<b class='flag-5'>優(yōu)化</b>

    MySQL高級(jí)進(jìn)階:索引優(yōu)化

    MySQL官方對(duì)于索引的定義:索引是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。
    的頭像 發(fā)表于 06-11 11:13 ?503次閱讀
    MySQL高級(jí)進(jìn)階:<b class='flag-5'>索引</b><b class='flag-5'>優(yōu)化</b>

    Mysql索引是什么東西?索引有哪些特性?索引是如何工作的?

    作為開(kāi)發(fā)人員,碰到了執(zhí)行時(shí)間較長(zhǎng)的 sql 時(shí),基本上大家都會(huì)說(shuō)” 加個(gè)索引吧”。但是索引是什么東西,索引有哪些特性,下面和大家簡(jiǎn)單討論一下。
    的頭像 發(fā)表于 12-24 16:20 ?970次閱讀
    Mysql<b class='flag-5'>索引</b>是什么東西?<b class='flag-5'>索引</b>有哪些特性?<b class='flag-5'>索引</b>是如何工作的?

    導(dǎo)致MySQL索引失效的情況以及相應(yīng)的解決方法

    導(dǎo)致MySQL索引失效的情況以及相應(yīng)的解決方法? MySQL索引的目的是提高查詢效率,但有些情況下索引可能會(huì)失效,導(dǎo)致查詢變慢或效果不如預(yù)期
    的頭像 發(fā)表于 12-28 10:01 ?633次閱讀

    谷歌搜索引優(yōu)化的各個(gè)方面和步驟

    谷歌搜索引擎是最受歡迎和廣泛使用的搜索引擎之,為了使你的網(wǎng)站在谷歌上更好地排名并提高曝光度,你可以采取些谷歌搜索引
    的頭像 發(fā)表于 01-25 10:29 ?714次閱讀

    MATLAB中的矩陣索引

    對(duì)矩陣進(jìn)行索引是從矩陣中選擇或修改部分元素的種方式。MATLAB 有幾種索引樣式,它們不僅功能強(qiáng)大、靈活,而且可讀性強(qiáng)、表現(xiàn)力強(qiáng)。矩陣是 MATLAB 用來(lái)組織和分析數(shù)據(jù)的
    的頭像 發(fā)表于 09-05 09:28 ?191次閱讀
    MATLAB中的矩陣<b class='flag-5'>索引</b>