最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mysql索引覆蓋的實(shí)現(xiàn)

 更新時(shí)間:2023年03月03日 10:14:43   作者:京東零售 孫濤  
本文主要介紹了Mysql索引覆蓋的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

1.什么是覆蓋索引

通常情況下,我們創(chuàng)建索引的時(shí)候只關(guān)注where條件,不過(guò)這只是索引優(yōu)化的一個(gè)方向。優(yōu)秀的索引設(shè)計(jì)應(yīng)該縱觀整個(gè)查詢,而不僅僅是where條件部分,還應(yīng)該關(guān)注查詢所包含的列。索引確實(shí)是一種高效的查找數(shù)據(jù)方式,但是mysql也可以從索引中直接獲取數(shù)據(jù),這樣就不在需要讀數(shù)據(jù)行了。 覆蓋索引(covering index) 指一個(gè)查詢語(yǔ)句的執(zhí)行只需要從輔助索引中就可以得到查詢記錄,而不需要回表,去查詢聚集索引中的記錄??梢苑Q之為實(shí)現(xiàn)了索引覆蓋。 在mysql數(shù)據(jù)庫(kù)中,如何看出一個(gè)sql是否實(shí)現(xiàn)了索引覆蓋呢?

從執(zhí)行計(jì)劃看,Extra的信息為using index ,即用到了索引覆蓋。

2.覆蓋索引為什么快

innodb存儲(chǔ)引擎底層實(shí)現(xiàn)包括B+樹索引和哈希索引,innodb存儲(chǔ)引擎默認(rèn)的索引模型/結(jié)構(gòu)是B+樹,所以大部分時(shí)候我們使用的都是B+樹索引,因?yàn)樗己玫男阅芎吞匦愿m合于構(gòu)建高并發(fā)系統(tǒng)。根據(jù)索引的存儲(chǔ)方式來(lái)劃分,索引可以分為聚簇索引和非聚簇索引。聚簇索引的特點(diǎn)是葉子節(jié)點(diǎn)包含了完整的記錄行,而非聚簇索引的葉子節(jié)點(diǎn)只有索引字段和主鍵ID。非聚簇索引中因?yàn)椴缓型暾臄?shù)據(jù)信息,查找完整的數(shù)據(jù)記錄需要回表,所以一次查詢操作實(shí)際上要做兩次索引查詢。而如果所有的索引查詢都要經(jīng)過(guò)兩次才能查到,那么肯定會(huì)引起效率下降,畢竟能少查一次就少查一次。

覆蓋索引就實(shí)現(xiàn)了從非聚簇索引中直接獲取數(shù)據(jù),所以效率會(huì)提升。

3.SQL優(yōu)化場(chǎng)景

(1)無(wú)where條件

請(qǐng)看下面的sql

執(zhí)行計(jì)劃中,type為ALL,代表進(jìn)行了全表掃描,掃描行數(shù)達(dá)到了26274308,所以執(zhí)行時(shí)間為9.25秒,也是正常的。

那么如何優(yōu)化??jī)?yōu)化措施很簡(jiǎn)單,就是對(duì)查詢列建立索引。如下,

alter table instance_space_history add index idx_org1(org1); 看添加索引后的執(zhí)行計(jì)劃

Possible_keys為null,說(shuō)明沒(méi)有where條件時(shí)優(yōu)化器無(wú)法通過(guò)索引檢索數(shù)據(jù);

但是看extra的信息 Using index,即從索引中獲取數(shù)據(jù),減少了讀取的數(shù)據(jù)塊的數(shù)量 。

在看實(shí)際優(yōu)化效果,掃描行數(shù)沒(méi)變,但是使用了覆蓋索引,查詢時(shí)間從9.25秒縮短到5.67秒。 思考: 無(wú)where條件的查詢,可以通過(guò)索引來(lái)實(shí)現(xiàn)索引覆蓋查詢。但前提條件是,查詢返回的字段數(shù)足夠少,更不用說(shuō)select *之類的了。畢竟,建立key length過(guò)長(zhǎng)的索引,始終不是一件好事情。

(2)where條件區(qū)分度低

使用區(qū)分度極低的字段作為where條件的查詢SQL,對(duì)于dba或者研發(fā)人員優(yōu)化一直是比較頭疼的問(wèn)題,這里介紹一種思路,就是通過(guò)索引覆蓋來(lái)優(yōu)化 。 t_material_image是一張8億多數(shù)據(jù)的大表,where條件的material_type字段區(qū)分度很低,下面是沒(méi)加任何索引的執(zhí)行計(jì)劃和查詢時(shí)間(7.35秒)。

最容易想到的優(yōu)化方式,就是給where條件的字段加索引,添加索引語(yǔ)句如下: alter table t_material_image add index idx_material_type (material_type);

再來(lái)看執(zhí)行計(jì)劃

通過(guò)執(zhí)行計(jì)劃和測(cè)試結(jié)果看,的確是有效果的,但是走索引后的查詢效率依然不能滿足我們期望。 然后試著給material_type,material_id添加聯(lián)合索引。 alter table t_material_image add index idx_material_id_type (material_type,material_id);

從這個(gè)sql的執(zhí)行計(jì)劃看,出現(xiàn)Using index,實(shí)現(xiàn)了索引覆蓋;再看執(zhí)行時(shí)間,性能得到了巨大的提升,居然已經(jīng)可以跑到0.85s左右了。

思考:

當(dāng)where條件字段區(qū)分度低(過(guò)濾性差),且where條件與查詢字段總數(shù)較少的情況下,使用索引覆蓋優(yōu)化,是個(gè)不錯(cuò)的選擇。

(3)查詢僅選擇主鍵

對(duì)于Innodb的輔助索引,它的葉子節(jié)點(diǎn)存儲(chǔ)的是索引值和指向主鍵索引的位置,然后需要通過(guò)主鍵在查詢表的字段值,所以輔助索引存儲(chǔ)了主鍵的值。如果查詢所選擇的列只有主鍵,應(yīng)該考慮通過(guò)索引覆蓋優(yōu)化。 看下面的兩個(gè)sql,字段 pin 和completion_time有聯(lián)合索引,where條件差別只有comment_voucher_status = 0,但是執(zhí)行時(shí)間差距巨大(第一個(gè)sql0.58s,第二個(gè)sql0.2s),為什么呢?是不是很困惑

我們來(lái)看執(zhí)行計(jì)劃,主要差別體現(xiàn)在extra,第一個(gè)sql用到Using index condition,而第二個(gè)sql用到Using index,因?yàn)閜in和completion_time有聯(lián)合索引,而且查詢結(jié)果只選擇了主鍵id,所以第二個(gè)sql覆蓋了所有的where條件字段和查詢結(jié)果選擇字段,故實(shí)現(xiàn)了索引覆蓋。 思考:

當(dāng)查詢字段只有主鍵時(shí),更容易實(shí)現(xiàn)索引覆蓋,因?yàn)樗饕灰采wwhere條件,就可以實(shí)現(xiàn)索引覆蓋。

4.總結(jié)與建議

索引的核心作用: (1)通過(guò)索引檢索僅需要數(shù)據(jù) (2)從索引中直接獲取查詢結(jié)果
索引覆蓋的條件: (1)Select查詢的返回列包含在索引列中 (2)有where條件時(shí),where條件中要包含索引列或復(fù)合索引的前導(dǎo)列 (3)查詢結(jié)果的總字段長(zhǎng)度可以接受

到此這篇關(guān)于Mysql索引覆蓋的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Mysql索引覆蓋內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL和Redis實(shí)現(xiàn)二級(jí)緩存的方法詳解

    MySQL和Redis實(shí)現(xiàn)二級(jí)緩存的方法詳解

    這篇文章主要給大家介紹了關(guān)于MySQL和Redis實(shí)現(xiàn)二級(jí)緩存的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • MySQL提示“too?many?connections“錯(cuò)誤的解決過(guò)程

    MySQL提示“too?many?connections“錯(cuò)誤的解決過(guò)程

    當(dāng)大量的connect之后,就會(huì)出現(xiàn)Too many connections的錯(cuò)誤,下面這篇文章主要給大家介紹了關(guān)于MySQL提示“too?many?connections“錯(cuò)誤的解決過(guò)程,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • mysql 鎖表鎖行語(yǔ)句分享(MySQL事務(wù)處理)

    mysql 鎖表鎖行語(yǔ)句分享(MySQL事務(wù)處理)

    下面這個(gè)語(yǔ)句是鎖定一行數(shù)據(jù),開始讀取,一直到刪除后都不會(huì)有第二個(gè)人也讀到這條數(shù)據(jù)
    2011-09-09
  • MySql中特殊運(yùn)算符的使用方法總結(jié)

    MySql中特殊運(yùn)算符的使用方法總結(jié)

    這篇文章主要給大家介紹了關(guān)于MySql中特殊運(yùn)算符的使用方法,分別介紹的是<=> 安全比較運(yùn)算符、:= 賦值的作用、@ 用戶變量以及@@ 系統(tǒng)變量,文中介紹的非常詳細(xì),需要的朋友可以參考下
    2018-09-09
  • MySQL如何比較時(shí)間(datetime)大小

    MySQL如何比較時(shí)間(datetime)大小

    這篇文章主要介紹了MySQL如何比較時(shí)間(datetime)大小,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • JMeter壓測(cè)Mysql教程分享

    JMeter壓測(cè)Mysql教程分享

    文章介紹了如何使用JMeter進(jìn)行數(shù)據(jù)庫(kù)壓力測(cè)試的步驟,包括安裝JMeter、下載并配置MySQL JDBC驅(qū)動(dòng)、設(shè)置測(cè)試計(jì)劃、添加JDBC連接配置元件、添加JDBC請(qǐng)求取樣器以及可選的監(jiān)聽器配置,最后,文章指導(dǎo)如何運(yùn)行測(cè)試并分析結(jié)果,以評(píng)估數(shù)據(jù)庫(kù)在不同壓力下的性能表現(xiàn)
    2024-11-11
  • mysql中find_in_set()函數(shù)用法及自定義增強(qiáng)函數(shù)

    mysql中find_in_set()函數(shù)用法及自定義增強(qiáng)函數(shù)

    MySQL 中的 FIND_IN_SET 函數(shù)用于在逗號(hào)分隔的字符串列表中查找指定字符串的位置,本文就來(lái)介紹一下mysql中find_in_set()函數(shù)用法及自定義增強(qiáng)函數(shù)
    2024-08-08
  • mysql5.6及以下版本如何查詢數(shù)據(jù)庫(kù)里的json

    mysql5.6及以下版本如何查詢數(shù)據(jù)庫(kù)里的json

    MySQL里面保存數(shù)據(jù)有時(shí)候會(huì)把一些雜亂且不常用的時(shí)候丟進(jìn)一個(gè)json字段里面,那么如何查詢數(shù)據(jù)庫(kù)里的json呢以及mysql存儲(chǔ)json注意那些格式呢?接下來(lái)通過(guò)本文給大家詳細(xì)介紹,需要的朋友參考下
    2017-03-03
  • MySQL取消了Query Cache的原因

    MySQL取消了Query Cache的原因

    這篇文章主要介紹了MySQL取消了Query Cache的原因,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下
    2020-10-10
  • MySQL因大事務(wù)導(dǎo)致的Insert慢實(shí)例分析

    MySQL因大事務(wù)導(dǎo)致的Insert慢實(shí)例分析

    這篇文章主要給大家介紹了關(guān)于MySQL因大事務(wù)導(dǎo)致Insert慢的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10

最新評(píng)論

上虞市| 环江| 长沙市| 菏泽市| 呼图壁县| 武平县| 六盘水市| 马边| 阳曲县| 阿拉善右旗| 长宁区| 宜兰县| 从江县| 乾安县| 云南省| 镇赉县| 惠安县| 潜山县| 清流县| 丰镇市| 大城县| 宜州市| 滦平县| 类乌齐县| 岱山县| 江达县| 绩溪县| 黔南| 大足县| 鄂托克前旗| 民县| 红原县| 沈阳市| 南雄市| 浦江县| 西藏| 民勤县| 昆明市| 澳门| 长泰县| 镇安县|