Mysql高級3-索引的結構和分類

来源:https://www.cnblogs.com/Se7eN-HOU/archive/2023/07/27/17586395.html
-Advertisement-
Play Games

一、索引概述 1.1 索引的介紹 索引index:是幫助 Mysql 高效獲取數據 的 有序的數據結構,在數據之外,資料庫系統維護著的滿足特定查找演算法的數據結構,這些數據結構以某種方式引用(指向)數據,這樣就可以在這些數據結構上實現高級查找演算法,這種數據結構就是索引 1.2 索引的優缺點 優點1:提 ...


一、索引概述

  1.1 索引的介紹

    索引index:是幫助 Mysql 高效獲取數據 的 有序的數據結構,在數據之外,資料庫系統維護著的滿足特定查找演算法的數據結構,這些數據結構以某種方式引用(指向)數據,這樣就可以在這些數據結構上實現高級查找演算法,這種數據結構就是索引

  1.2 索引的優缺點

    • 優點1:提高數據檢索的效率,降低資料庫的IO成本
    • 優點2:通過索引列對數據進行排序,降低數據排序的成本,降低CPU的消耗
    • 缺點1:索引列也要占磁碟空間。
    • 缺點2:索引大大提高了查詢效率,同時卻也降低了更新表的速度,如對錶進行insert,update,delete時,效率降低

 

二、索引結構

  2.1 Mysql的索引常見結構

    Mysql的索引是在儲存引擎層實現的,不同的存儲引擎有不同的結構,主要包含一下幾種 

    • B+樹:最常見的索引類型,大部分引擎都支持B+樹索引
    • Hash索引:底層數據結構是用哈希表實現的,只有精確匹配索引的查詢才有效,不支持範圍查詢 

 

  2.2 Mysql常見索引對不同引擎的支持

    • B+樹:InnoDB(支持)、MyISAM(支持)、Memory(支持)
    • Hash索引:InnoDB(不支持)、MyISAM(不支持)、memory(支持)

 

  2.3 二叉樹實現索引的弊端

    

    說明1:實際中的索引是沒有使用二叉樹的,因為二叉樹具有一下的弊端   

    說明2:當順序插入時,會形成一個鏈表,查詢性能大大降低,大數據量的情況下,層級較深,檢索速度慢。

    說明3:特殊二叉樹紅黑樹當做索引是,大數據量情況下,層級比較深,檢索速度慢

 

  2.4 B樹實現索引的弊端

    以一個最大度數(max-degree)為5(5階)的b樹為例(每個節點最多儲存4個key,5個指針)

    

    說明:B樹的數據會存在每個節點上,而節點存在頁(2.6 Mysql索引對B+樹的優化有說明)上面,每頁的大小為16K,這樣每個頁能存放的索引就比較少,導致同樣數據體積小,層級要比B+樹深。

 

  2.5 B+樹實現索引

    以一個最大度數(max-degree)為4(4階)的b+樹為例

     

 

    說明:對比較與B樹

      1、所有的數據都會出現在葉子節點上

      2、葉子節點形成一個單向鏈表

  2.6 Mysql索引對B+樹的優化

    Mysql索引數據結構對經典的B+樹進行了優化,在原來的B+樹基礎上,增加了一個指向相鄰葉子節點的鏈表指針,就行了帶有順序指針的B+樹,提高了區間訪問的性能

    

    說明:每頁在InnoDB中預設16K

  

  2.7 hash索引

    哈希索引就是採用一定的hash演算法,將鍵值換成新的hash值,映射到對應的槽位上,然後儲存在hash表中

     

    說明:如果兩個(或者多個)鍵映射到同一個槽位上,他們就產生了hash衝突,也稱hash碰撞,可以通過鏈表來解決

  

  2.8 hash索引特點

    • hash索引只能用於對等比較(=,in),不支持範圍查詢(between,>,<)
    • 無法利用索引完成排序操作
    • 查詢效率高,通常只需要一次檢索就可以了,效率通常要高於B+樹索引
    • 在Mysql中,支持hash索引的事Memory引擎,而InnoDB中具有自適應hash功能,hash索引是存儲引擎根據B+樹索引在指定條件下自動構建的

 

   2.9 InnoDB引擎選擇B+樹的優勢

    • 相對於二叉樹,層級更少,搜索效率高
    • 對於B樹,無論是葉子節點還是非葉子節點,都會保存數據,這樣導致一頁中存儲的鍵值減少,指針跟著減少,同樣保存大量數據,只能增加樹的高度,導致性能降低。
    • 相對於hash索引,B+樹支持範圍匹配及排序操作  

 

三、索引分類

  3.1 主鍵索引

    針對於表中主鍵創建的索引,預設自動創建,只能有一個, 關鍵字:primary

  3.2 唯一索引

    避免同一個表中某數據列中的值重覆,可以有多個,關鍵字:unique

  3.3 常規索引

    快速定位特定數據,可以有多個,

  3.4 全文索引

    全文索引查找的是文本中的關鍵字,而不是比較索引中的值,可以有多個,fulltext

  3.5 聚集索引

    在InnoDB中,根據索引的儲存形式劃分的,將數據儲存與索引放到一起,索引結構的葉子節點保存了行數據,必須有,而且只有一個

    • 如果存在主鍵,主鍵索引就是聚集索引
    • 如果不存在主鍵,將使用第一個唯一(unique)索引作為聚集索引
    • 如果表沒有主鍵,也沒有合適的唯一索引,則InnoDB會自動生成一個rowid作為隱藏的聚集索引

  3.6 二級索引

    在InnoDB中,根據索引的儲存形式劃分的,將數據與索引分開儲存,索引結構的葉子節點關聯的是對應的主鍵,可以存在多個

   

     說明:聚集索引下麵存放的是整行的數據,二級索引下麵存放的對應的主鍵,要不然聚集索引下存放了整行數據,二級索引下也放整行數據,就會很冗餘

  3.7 回表查詢

    

    說明1:首先根據name欄位走二級索引

    說明2:找到Arm對應的id=10

    說明3:然後再根據id=10找到對應的數據

    說明4:整個過程也叫做回表查詢

 

四、索引語法

  4.1 查看索引

show index from 表名

    示例:

mysql> show index from account;
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| Table   | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| account |          0 | PRIMARY  |            1 | id          | A         |           4 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
1 row in set (0.00 sec)

    說明:account 有一個主鍵索引

  4.2 創建索引

create [unique | fulltext] index 索引名 on 表名(索引的列名, ..); 

    說明1:如果創建索引的欄位是唯一的,值都不重覆,可以加unique約束,說明這是一個唯一欄位索引

    說明2:fulltext 是全文檢索索引,主要針對大的文本欄位

mysql> create index name_idx on account(name);
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from account;
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| Table   | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| account |          0 | PRIMARY  |            1 | id          | A         |           4 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
| account |          1 | name_idx |            1 | name        | A         |           4 |     NULL |   NULL | YES  | BTREE      |         |               | YES     | NULL       |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
2 rows in set (0.01 sec)

    說明1:這就創建了一個名為name_idx的索引

  4.3 刪除索引

drop index 索引名 on 表名

    示例

mysql> drop index name_idx on account;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from account;
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| Table   | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| account |          0 | PRIMARY  |            1 | id          | A         |           4 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
1 row in set (0.00 sec)

    說明:這就刪除了一個索引

 

五、預告

  後面的文章會繼續介紹索引的使用和設計原則


侯哥語錄:我曾經是一個職業教育者,現在是一個自由開發者。我希望我的分享可以和更多人一起進步。分享一段我喜歡的話給大家:"我所理解的自由不是想乾什麼就乾什麼,而是想不幹什麼就不幹什麼。當你還沒有能力說不得時候,就努力讓自己變得強大,擁有說不得權利。"
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • #1. 可空類型修飾符? ```CSharp int i? num=null;//表示可空的整型 DateTime time? dateTime=null; //表示可空的時間 ``` #2.三元(運算符)表達式?: ```C# x?y:z //表示如果表達式x為true,則返回y,如果x為fals ...
  • # 在虛擬機(VMware)上安裝OpenKylin開源操作系統 今天我們一下學習下開放麒麟系統的安裝。也是我的開源項目在OpenKylin上運行的實踐。 希望通過該項目瞭解和學習Avalonia開發的朋友可以在我的github上拉取代碼,同時希望大家多多點點star。 https://github ...
  • Windows 服務預設的遠程桌面服務埠號是3389,在創建完Azure VM之後基本都會添加一個any to any的防火牆規則,方便多人登錄這個機器。 但是隨時隨地的3389掃描搞得我很煩,就修改了預設的windows 遠程桌面服務的埠號,修改完沒有在VM里的windows 自帶防火牆中添加 ...
  • 在Linux標準IO中,就是用庫函數對文件進行操作。在C語言中有許多庫函數方便用戶去對文件進行操作。下麵談談一些簡單基本的函數,這些函數都是被包含在頭文件stdio.h中的。 一、fopen()函數 要操作一個文件,我們肯定先打開它,這裡打開並不是去右鍵文件然後左鍵打開。這裡的打開是指讓系統知道程式 ...
  • ## 1、CentOS-7 > 註意:下列命令要用root賬號/許可權執行 ### 1.1、查看防火牆狀態 ``` systemctl status firewalld ``` ### 1.2、非永久性關閉防火牆 ``` systemctl stop firewalld ``` ### 1.3、非永久 ...
  • # 一、複製文件夾cp ``` cp -a vue vue-copy ``` 將vue 文件夾下麵的所有文件,複製到同目錄下vue-copy文件夾下麵 ![image](https://img2023.cnblogs.com/blog/3202319/202307/3202319-202307271 ...
  • 碼農一枚,Mac作為生產力工具已經有10多年了。 用Mac的原因除了系統清爽,逼格高之外,最主要還是因為作為一個資深全棧,要做Apple相關開發,必須用MacOS系統。😅 與Windows不同,MacOS上流行使用的軟體很多都很小眾,作者也不是大廠,但有很多卻很實用,這裡介紹幾款我常用的免費軟體。 ...
  • ![](https://img2023.cnblogs.com/blog/3076680/202307/3076680-20230726164318392-162588362.png) # 1. 結果集 ## 1.1. sql ```sql select empno,mgr from emp ord ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...