Mysql性能優化:為什麼要用覆蓋索引?

来源:https://www.cnblogs.com/Chenjiabing/archive/2020/03/29/12591343.html
-Advertisement-
Play Games

導讀 相信讀者看過很多MYSQL索引優化的文章,其中有很多優化的方法,比如最佳左首碼,覆蓋索引等方法,但是你真正理解為什麼要使用最佳左首碼,為什麼使用覆蓋索引會提升查詢的效率嗎? 本篇文章將從MYSQL內部結構上講一下為什麼覆蓋索引能夠提升效率。 InnoDB索引模型 在InnoDB中,表都是根據主 ...


導讀

 

  • 相信讀者看過很多MYSQL索引優化的文章,其中有很多優化的方法,比如最佳左首碼,覆蓋索引等方法,但是你真正理解為什麼要使用最佳左首碼,為什麼使用覆蓋索引會提升查詢的效率嗎?

  • 本篇文章將從MYSQL內部結構上講一下為什麼覆蓋索引能夠提升效率。

InnoDB索引模型

  • 在InnoDB中,表都是根據主鍵順序以索引的形式存放的,這種存儲方式的表稱為索引組織表。又因為前面我們提到的,InnoDB使用了B+樹索引模型,所以數據都是存儲在B+樹中的。

  • 每一個索引在InnoDB裡面對應一棵B+樹

 

主鍵索引和非主鍵索引的區別

  • 主鍵索引又叫聚簇索引 ,非主鍵索引又叫普通索引,那麼這兩種索引有什麼區別呢?

  • 主鍵索引的葉子節點存放的是整行數據,非主鍵索引的葉子節點存放的是主鍵的值。

  • 假設有一張User表(id,age,name,address),其中有id和age兩個欄位,其中id是主鍵,age是普通索引,有幾行數據u1-u5的(id,age)的值是(100,1)、(200,2)、(300,3)、(500,5)和(600,6) ,此時的兩棵樹的示例如下:

  • 從上圖可以看出來,基於主鍵索引的樹的葉子節點存放的是整行User數據,基於普通索引age的葉子節點存放的是id(主鍵)的值。

 

什麼是回表?

  • 假設有一條查詢語句如下:

  select * from user where age=3;
  • 上面這條sql語句執行的過程如下:

    1、根據age這個普通索引在age索引樹上搜索,得到主鍵id的值為300。

    2、因為age索引樹並沒有存儲User的全部數據,因此需要根據在age索引樹上查詢到的主鍵id的值300再到id索引樹搜索一次,查詢到了u3。

    3、返回結果。

  • 上述執行的過程中,從age索引樹再到id索引樹的查詢的過程叫做回表(回到主鍵索引樹搜索的過程)。

  • 也就是說通過非主鍵索引的查詢需要多掃描一棵索引樹,因此需要儘量使用主鍵索引查詢。

 

為什麼使用覆蓋索引?

  • 有了上述提及到的幾個概念,便能很清楚的理解為什麼覆蓋索引能夠提升查詢效率了,因為少了一次回表的過程。

  • 假設我們使用覆蓋索引查詢,語句如下:

  select id from user where age=3;
  • 這條語句執行過程很簡單,直接在age索引樹中就能查詢到id的值,不用再去id索引樹中查找其他的數據,避免了回表。

 

總結

  • 覆蓋索引的使用能夠減少樹的搜索次數,避免了回表,顯著提升了查詢性能,因此覆蓋索引是一個常用的性能優化手段。

  • 留給讀者一個問題:身份證是一個人的唯一識別憑證,如果有根據身份證號查詢市民信息的需求,我們只要在身份證號欄位上建立索引就夠了。而再建立一個(身份證號、姓名)的聯合索引,是不是浪費空間?

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 問題:scott用戶導入dmp文件,提示沒有DBA許可權。 解決方法: 1.授予dba角色許可權: grant dba to scott; 2.導入數據: imp scott/1234@myDB file=G:\ac43_620.dmp full=y 3.取消dba角色許可權: revoke dba fr ...
  • 在windows 10 64位操作系統中安裝Oracle win64 11g R2資料庫軟體,啟動SQL Developer卻提示缺少快捷方式,具體如下: 網上查閱參考了一些網友的解決方案,記錄如下: 1.在Oracle官方網站下載windows 64位的sqldeveloper安裝包zip文件。 ...
  • 一、下載下載oracle11g安裝文件,一般包括win64_11gR2_database_1of2和win64_11gR2_database_2of2 2個文件,下載完成後解壓到一個文件中: 下載文件: 解壓之後的文件夾: 二、準備1.配置 NET Framework 3.5 當然也可以離線安裝。 ...
  • 本次項目開發的各模塊靈感來自於市面上已經成熟的各大電商項目(網上商城)、例如淘寶京東。項目開發時間為2020/2/27—2020/3/28。開發工具前期使用Eclipse創建的Dynamic Web項目(動態web項目),到中期使用IDEA開發工具將項目轉為Maven項目繼續開發(期間自學了Mave ...
  • 筆者最近遇到一則典型的因為sql中存在派生表造成的性能案例,通過改寫SQL改善了的性能,但當時並沒有弄清楚這其中的原因,派生表究竟是什麼原因會導致性能上的副作用。說來也巧,很快就無意中就看到下文中的提到的相關的派生表的介紹以及其特性之後,才發現個中緣由,本文基於此,用一個非常簡單的demo來演示該問 ...
  • Redis底層函數詳解 1. serverCron 函數 它負責管理伺服器的資源,並維持伺服器的正常運行。在執行 serverCron 函數的過程中會調用相關的子函數,如 trackOperationsPerSecond、SigtermHandler、clientsCron、databasesCro ...
  • 1 MongoDB 簡介 1.1 使用場景 (1)數據量大 (2)價值較低 對於這樣的數據,更適合於使用MangoDB來存儲數據 1.2 什麼是MangoDB MangoDB是一個跨平臺的面向 文檔(相當於Mysql中的一行記錄) 的資料庫,是NoSql資料庫中最熱門的一種。它介於關係和非關係資料庫 ...
  • 來自於一個基友的問題:他的博客同問題鏈接 sql時間段取並集、合併 https://blog.csdn.net/Seandba/article/details/105152412 問題:計算通道的總開放時長,只要有任意一個終端開放通道就算開放,難點在於各種終端開放時間重疊包含問題測試數據--問題一、... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...