在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

什么是索引合優化?探究一下索引合并的幾種情況

dyquk4xk2p3d ? 來源:后端開發技術 ? 2023-09-26 09:14 ? 次閱讀

什么是索引合優化

在使用 explain 命令分析 SQL 執行情況的時候,type列會描述了表如何被連接,這個列的內容直接反映了 SQL 執行的效率。當里面的內容展示為 index_merge時表示使用了索引合并優化,在這種情況下輸出行中的key列包含具體使用的索引。

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

MySQL 的索引合并優化是一種查詢優化技術,它利用多個索引來加速查詢的執行。當一個查詢中包含多個條件,并且這些條件分別適用于不同的索引時,MySQL 可以將這些索引合并起來使用,減少了回表的次數,以加速查詢的執行。

簡單來說過程是這樣:

查詢條件同時包含 index1 和 index2。

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

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

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

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

準備

我們使用如下數據做測試,并且建立了三個索引。

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 多條數據用于測試。

基本用法

Index Merge 通過多次 range掃描檢索行并將它們的結果合并為一個。僅限合并來自單個表的索引掃描,而不是跨多個表的掃描。合并可以產生其底層掃描的并集、交集或交集并集,所以產生了三種算法

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

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);

索引合并優化算法注意事項如下

1、如果您的查詢有一個復雜的WHERE 子句,帶有深度 AND/OR 嵌套,而 MySQL 沒有選擇最佳執行計劃,請嘗試使用以下恒等變換。

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

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

三種算法

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

交集算法Using intersect(...)

并集算法 Using union(...)

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

下面我們詳細介紹這些算法,優化器根據各種可用選項的成本估算,在不同的索引合并算法之間進行選擇。

Index Merge 的使用受制于 系統變量的index_merge、 index_merge_intersection、 index_merge_union和 index_merge_sort_unionflags 的值optimizer_switch 。默認情況下,所有這些標志都是on. 要僅啟用某些算法,請設置index_merge 為off,并僅啟用應允許的其他算法。

1.交集算法

當查詢條件是多個查詢的時候,并且條件用 and 關聯,這種情況會使用交集(intersect)算法,滿足以下條件之一都可以。

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

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

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

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

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

2.并集算法

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

不同普通索引列使用 or 關聯

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 關鍵詞組合的多個范圍查詢。

例子:

explainselect*fromtest_tablewheremerchant_id

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

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








審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • SQL
    SQL
    +關注

    關注

    1

    文章

    766

    瀏覽量

    44164
  • MYSQL數據庫
    +關注

    關注

    0

    文章

    96

    瀏覽量

    9398

原文標題:面試官:會SQL調優,那你知道索引合并嗎?

文章出處:【微信號:良許Linux,微信公眾號:良許Linux】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    如何利用Flood多維索引技術實現優化數據存儲布局

    R-Trees,Z-ordering等,然而這些索引結構在不同的數據集以及查詢集合(query workload)很難進行統優化。在本篇論文中,提出了名為Flood的多維學習
    的頭像 發表于 09-22 16:38 ?3811次閱讀
    如何利用Flood多維<b class='flag-5'>索引</b>技術實現<b class='flag-5'>優化</b>數據存儲布局

    基于索引的SQL語句優化之降龍十八掌

    使用全表掃描還是使用索引和所有的秘笈樣,最后招都會又回到起點,最后我們來討論一下是否需要建立索引,也許進行全表掃描更快。在大多數
    發表于 09-25 13:24

    LV Nugget之數組索引的妙用

    數組元素。下圖所示的例子在初學者編程中經常遇到,這是我最近遇到初學者的用法。上述操作使用索引數組函數即可以實現,如下圖所示。如果索引數組函數的索引端子不連接,首個
    發表于 11-16 13:50

    LabVIEW Nugget之數組索引的妙用

    數組元素。下圖所示的例子在初學者編程中經常遇到,這是我最近遇到初學者的用法。上述操作使用索引數組函數即可以實現,如下圖所示。如果索引數組函數的索引端子不連接,首個
    發表于 12-18 15:02

    求各位大神指點一下,關于自動索引

    請各位大神指點一下怎么關閉labview2015 for循環中的”自動索引“,我右擊那個左邊框上面的小方框,沒有關閉選項
    發表于 05-21 01:12

    Mysql優化選擇最佳索引規則

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

    MySQL索引使用優化和規范

    MySQL - 索引使用優化和規范
    發表于 06-15 16:01

    MySQL索引的使用問題

    、前言 在MySQL中進行SQL優化的時候,經常會在情況下,對MySQL能否利用索引
    的頭像 發表于 01-06 16:13 ?1615次閱讀

    一百道關于MySQL索引解答

    數據庫 1. MySQL索引使用有哪些注意事項呢? 可以從三個維度回答這個問題:索引哪些情況會失效,索引不適合哪些場景,索引規則
    的頭像 發表于 06-13 15:51 ?2109次閱讀

    數據庫索引使用策略及優化

    索引使用策略及優化 MySQL的優化主要分為結構優化(Scheme optimization)和查詢優化(Query optimizatio
    的頭像 發表于 11-02 15:13 ?1727次閱讀
    數據庫<b class='flag-5'>索引</b>使用策略及<b class='flag-5'>優化</b>

    MySQL高級進階:索引優化

    MySQL官方對于索引的定義:索引是幫助MySQL高效獲取數據的數據結構。
    的頭像 發表于 06-11 11:13 ?586次閱讀
    MySQL高級進階:<b class='flag-5'>索引</b><b class='flag-5'>優化</b>

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

    作為開發人員,碰到了執行時間較長的 sql 時,基本上大家都會說” 加個索引吧”。但是索引是什么東西,索引有哪些特性,下面和大家簡單討論一下
    的頭像 發表于 12-24 16:20 ?1330次閱讀
    Mysql<b class='flag-5'>索引</b>是什么東西?<b class='flag-5'>索引</b>有哪些特性?<b class='flag-5'>索引</b>是如何工作的?

    導致MySQL索引失效的情況以及相應的解決方法

    導致MySQL索引失效的情況以及相應的解決方法? MySQL索引的目的是提高查詢效率,但有些情況下索引可能會失效,導致查詢變慢或效果不如預期
    的頭像 發表于 12-28 10:01 ?771次閱讀

    谷歌搜索引優化的各個方面和步驟

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

    MATLAB中的矩陣索引

    對矩陣進行索引是從矩陣中選擇或修改部分元素的種方式。MATLAB 有幾種索引樣式,它們不僅功能強大、靈活,而且可讀性強、表現力強。矩陣是 MATLAB 用來組織和分析數據的
    的頭像 發表于 09-05 09:28 ?479次閱讀
    MATLAB中的矩陣<b class='flag-5'>索引</b>
    主站蜘蛛池模板: 久久久久国产精品免费免费| 污污视频在线免费看| 手机看日韩毛片福利盒子| 午夜影视免费完整高清在线观看网站| 99色99| 午夜毛片网站| 欧美天天| 99精品偷自拍| 欧美另类激情| 一级美女片| 成年人三级视频| 午夜色站| 日本色色图| 视频h在线观看| 免费视频现线观看| 老司机色网| 五月六月伊人狠狠丁香网| 日本三级日本三级人妇三级四| 你懂的亚洲| 成人丁香婷婷| 六月婷婷七月丁香| 国产精品久久久久aaaa| 欧美三级色| 三级全黄a| 免费观看成人毛片| 福利视频一区二区微拍堂| 天天射天天干天天| 亚洲最色网| aaa一区二区三区| 日韩欧美在线中文字幕| 韩毛片| 国产成人精品亚洲日本在线 | 永久黄网站色视频免费| 色噜噜久久| 日韩国产片| 国产高清色播视频免费看| 三a大片| 羞羞视频靠逼视频大全| 特黄特色视频| 国产亚洲精品仙踪林在线播放| 天天干干干|