91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Mysql索引覆蓋如何實現

發布時間:2023-03-08 11:59:41 來源:億速云 閱讀:138 作者:iii 欄目:開發技術

這篇“Mysql索引覆蓋如何實現”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Mysql索引覆蓋如何實現”文章吧。

    1.什么是覆蓋索引

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

    Mysql索引覆蓋如何實現

    從執行計劃看,Extra的信息為using index ,即用到了索引覆蓋。

    2.覆蓋索引為什么快

    innodb存儲引擎底層實現包括B+樹索引和哈希索引,innodb存儲引擎默認的索引模型/結構是B+樹,所以大部分時候我們使用的都是B+樹索引,因為它良好的性能和特性更適合于構建高并發系統。根據索引的存儲方式來劃分,索引可以分為聚簇索引和非聚簇索引。聚簇索引的特點是葉子節點包含了完整的記錄行,而非聚簇索引的葉子節點只有索引字段和主鍵ID。非聚簇索引中因為不含有完整的數據信息,查找完整的數據記錄需要回表,所以一次查詢操作實際上要做兩次索引查詢。而如果所有的索引查詢都要經過兩次才能查到,那么肯定會引起效率下降,畢竟能少查一次就少查一次。

    覆蓋索引就實現了從非聚簇索引中直接獲取數據,所以效率會提升。

    Mysql索引覆蓋如何實現

    3.SQL優化場景

    (1)無where條件

    請看下面的sql

    Mysql索引覆蓋如何實現

    Mysql索引覆蓋如何實現

    執行計劃中,type為ALL,代表進行了全表掃描,掃描行數達到了26274308,所以執行時間為9.25秒,也是正常的。

    那么如何優化?優化措施很簡單,就是對查詢列建立索引。如下,

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

    Mysql索引覆蓋如何實現

    Possible_keys為null,說明沒有where條件時優化器無法通過索引檢索數據;

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

    Mysql索引覆蓋如何實現

    在看實際優化效果,掃描行數沒變,但是使用了覆蓋索引,查詢時間從9.25秒縮短到5.67秒。 思考: 無where條件的查詢,可以通過索引來實現索引覆蓋查詢。但前提條件是,查詢返回的字段數足夠少,更不用說select *之類的了。畢竟,建立key length過長的索引,始終不是一件好事情。

    (2)where條件區分度低

    使用區分度極低的字段作為where條件的查詢SQL,對于dba或者研發人員優化一直是比較頭疼的問題,這里介紹一種思路,就是通過索引覆蓋來優化 。 t_material_image是一張8億多數據的大表,where條件的material_type字段區分度很低,下面是沒加任何索引的執行計劃和查詢時間(7.35秒)。

    Mysql索引覆蓋如何實現

    Mysql索引覆蓋如何實現

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

    再來看執行計劃

    Mysql索引覆蓋如何實現

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

    Mysql索引覆蓋如何實現

    Mysql索引覆蓋如何實現

    從這個sql的執行計劃看,出現Using index,實現了索引覆蓋;再看執行時間,性能得到了巨大的提升,居然已經可以跑到0.85s左右了。

    思考:

    當where條件字段區分度低(過濾性差),且where條件與查詢字段總數較少的情況下,使用索引覆蓋優化,是個不錯的選擇。

    (3)查詢僅選擇主鍵

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

    Mysql索引覆蓋如何實現

    Mysql索引覆蓋如何實現

    Mysql索引覆蓋如何實現

    Mysql索引覆蓋如何實現

    我們來看執行計劃,主要差別體現在extra,第一個sql用到Using index condition,而第二個sql用到Using index,因為pin和completion_time有聯合索引,而且查詢結果只選擇了主鍵id,所以第二個sql覆蓋了所有的where條件字段和查詢結果選擇字段,故實現了索引覆蓋。 思考:

    當查詢字段只有主鍵時,更容易實現索引覆蓋,因為索引只要覆蓋where條件,就可以實現索引覆蓋。

    以上就是關于“Mysql索引覆蓋如何實現”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    林州市| 沽源县| 稷山县| 隆子县| 比如县| 潜江市| 金溪县| 盘锦市| 镶黄旗| 万盛区| 嘉定区| 班玛县| 庆元县| 舟曲县| 淮北市| 潮州市| 新宾| 滦平县| 同江市| 泰和县| 托克托县| 夏津县| 江孜县| 腾冲县| 嘉峪关市| 宿州市| 台安县| 昌平区| 西青区| 城固县| 同心县| 蕉岭县| 济南市| 遵化市| 安西县| 义马市| 澳门| 增城市| 余姚市| 乌鲁木齐县| 谢通门县|