MSQL-聚簇索引與非聚簇索引的比較

聚簇索引詳解

InnoDB 的聚簇索引特性

  1. 表數據本身就是聚簇索引

    • 數據行實際存儲在聚簇索引的葉子節點中
    • "表就是索引,索引就是表"的結構
    • 每個InnoDB表有且只有一個聚簇索引

? ? ? ? ?聚簇索引的葉子節點存儲的是:真實數據

  1. 主鍵作為聚簇索引

    CREATE TABLE users (id INT PRIMARY KEY,  -- 此主鍵自動成為聚簇索引name VARCHAR(100),email VARCHAR(100)
    );
    
  2. 無顯式主鍵時的處理

    • 如果表沒有定義主鍵,InnoDB會選擇一個唯一的非空索引代替
    • 如果沒有這樣的索引,InnoDB會隱式創建一個6字節的ROWID作為聚簇索引

聚簇索引的優勢

  • 高效的主鍵查詢:直接通過B+樹定位到數據行
  • 范圍查詢高效:連續的主鍵值物理存儲也相鄰
  • 覆蓋索引優勢:需要的數據都在索引中時可避免二次查找

聚簇索引的缺點

  • 插入速度依賴插入順序:最好按主鍵順序插入
  • 更新主鍵代價高:可能導致行移動
  • 全表掃描可能較慢:當主鍵不連續時

非聚簇索引(二級索引)

非聚簇索引結構

  1. 索引結構與數據分離

    • 索引B+樹的葉子節點不包含完整行數據
    • 只存儲主鍵值(或ROWID)
  2. 查找過程需要回表

    二級索引查找 -> 找到主鍵 -> 通過主鍵到聚簇索引中查找完整數據

非聚簇索引示例

CREATE INDEX idx_name ON users(name);  -- 創建非聚簇索引

非聚簇索引的特點

  • 支持多個:一個表可以有多個非聚簇索引
  • 存儲內容:索引列值 + 主鍵值
  • 覆蓋索引優化:如果查詢的列都在索引中,可避免回表

? ? ? ? ?非聚簇索引的葉子節點存儲的是:索引列值 + 主鍵值

MyISAM 的非聚簇索引

MyISAM 存儲引擎使用的是純非聚簇索引結構:

  • 數據.MYD文件:存儲實際數據行
  • 索引.MYI文件:存儲所有索引
  • 索引葉子節點存儲的是數據行指針(物理地址)

對比總結

特性InnoDB聚簇索引InnoDB非聚簇索引MyISAM非聚簇索引
數據存儲位置索引葉子節點單獨存儲,引用主鍵單獨.MYD文件
索引數量每表1個多個多個
葉子節點內容完整數據行主鍵值數據文件指針
查找過程直接獲取數據需要回表直接通過指針訪問數據
主鍵查詢性能最優(O(1)~O(logN))需要兩次查找需一次索引查找
范圍查詢性能優秀(順序I/O)一般一般

MyISAM 的非聚簇索引:葉子節點存儲的數據文件指針(相對于InnoDB非聚簇索引,避免了回表)

實際應用建議

  1. 合理設計主鍵:短、有序(如自增INT),利用好聚簇索引特性

  2. 避免隨機主鍵:如UUID會導致大量頁分裂和碎片

  3. 覆蓋索引優化:使查詢只需訪問索引避免回表

思考:

  1. 多實例應用從分布式ID服務獲取ID后,由于網絡延遲、處理速度差異等原因,后獲取到的ID可能先提交事務,導致數據庫中ID不是嚴格遞增的,而是呈現"插入"形式(即小ID的記錄可能出現在大ID之后)

(其實業務能容忍小范圍的不一致)

方案1:業務邏輯的提交操作,盡量靠后,避免提前獲取id?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/91705.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/91705.shtml
英文地址,請注明出處:http://en.pswp.cn/web/91705.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

語音識別數據集

目錄 Voice Activity Detection 自己采集: 1. ASR Resources(語音識別資源) 2. LM Resources(語言模型資源) 這是一個數據表: 噪聲數據集: Voice Activity Detection 自己采集&#xff1a…

Linux線程同步與互斥(上)

目錄 前言 1.互斥 1.先來見一種現象(數據不一致問題) 2.如何解決上述問題 3.理解為什么數據會不一致&&認識加鎖的接口 4.理解鎖 5.鎖的封裝 前言 在前面對線程的概念和控制的學習過程中,我們知道了線程是共享地址空間的&#…

Codeforces Global Round 27

ABC 略D將每個數拆成x*2的整數次冪&#xff0c;一個直接的想法是盡量把2的整數次冪給大的數。那么所有乘上2的整數次冪的數構成的序列單調遞減&#xff0c;反證法&#xff0c;如果序列中存在i j 使得a[i]<a[j]&#xff0c;那么我們不如把給a[i]乘的2的冪給a[j]乘。#include …

深入 Go 底層原理(二):Channel 的實現剖析

1. 引言"Do not communicate by sharing memory; instead, share memory by communicating." (不要通過共享內存來通信&#xff0c;而應通過通信來共享內存。) 這是 Go 語言并發設計的核心哲學。而 channel 正是實現這一哲學的核心工具。Channel 為 Goroutine 之間的…

Golang 語言的編程技巧之類型

1、介紹Golang 語言是一門靜態類型的編程語言&#xff0c;我們在編寫代碼時&#xff0c;為了提升代碼的靈活性&#xff0c;有時會使用空接口類型&#xff0c;對于空接口類型的變量&#xff0c;一般會通過類型斷言判斷變量的類型&#xff0c;而且可能還會遇到遇到類型轉換的場景…

計數組合學7.11(RSK算法)

7.11 RSK算法 在對稱函數理論中&#xff0c;有一個非凡的組合對應關系&#xff0c;稱為RSK算法。&#xff08;關于縮寫RSK的含義以及其他名稱&#xff0c;請參閱本章末尾的注釋。&#xff09;這里我們僅介紹RSK算法的最基本性質&#xff0c;從而能夠給出舒爾函數一些基本性質的…

國產嵌入式調試器之光? RT-Trace 初體驗!

做過嵌入式開發的工程師肯定都知道有這么個玩意兒 —— J-Trace&#xff0c;與我們日常使用的普通調試器不同點在于&#xff0c;它在基本的下載/調試代碼之上還具有非常強大的代碼運行跟蹤能力&#xff0c;從而實現代碼覆蓋率的分析、指令回溯、CPU 資源監控等一系列強大的功能…

SLAM中的非線性優化-2D圖優化之零空間實戰(十六)

終于有時間更新實戰篇了&#xff0c;本節實戰幾乎包含了SLAM后端的所有技巧&#xff0c;其中包括&#xff1a;舒爾補/先驗Factor/魯棒核函數/FEJ/BA優化等滑動窗口法的相關技巧&#xff0c;其中構建2D輪式里程計預積分以及絕對位姿觀測的10幀滑動窗口&#xff0c;并邊緣化最老幀…

知識隨記-----Qt 實戰教程:使用 QNetworkAccessManager 發送 HTTP POST

文章目錄Qt 網絡編程&#xff1a;使用 QNetworkAccessManager 實現 HTTP POST 請求概要整體架構流程技術名詞解釋技術細節注意事項&#xff1a;Qt 網絡編程&#xff1a;使用 QNetworkAccessManager 實現 HTTP POST 請求 概要 本文介紹如何使用 Qt 框架的網絡模塊&#xff08;…

wordpress批量新建產品分類

1、下載安裝插件&#xff1a;bulk-category-import-export2、激活插件后&#xff0c;左側點擊插件下的導入&#xff0c;選擇product categories&#xff0c;點擊下一步3、這里可以選擇導入的分類列表文件&#xff0c;可以選擇分隔符&#xff0c;CSV文件默認為‘&#xff0c;’要…

CentOS 鏡像源配置與 EOL 后的應對策略

引言 本文將詳細介紹如何使用 阿里云開源鏡像站 配置 CentOS 的各類軟件源&#xff0c;包括基礎源、歷史歸檔源&#xff08;vault&#xff09;、ARM 架構源、Stream 版本以及調試信息源&#xff08;debuginfo&#xff09;&#xff0c;并重點講解在 CentOS 8 停止維護后&#x…

CTF實戰:用Sqlmap破解表單輸入型SQL注入題(輸入賬號密碼/usernamepassword)

目錄 引言 步驟1&#xff1a;用Burp Suite捕獲表單請求 步驟2&#xff1a;用Sqlmap獲取數據庫名稱 參數解釋&#xff1a; 輸出示例&#xff08;根據題目環境調整&#xff09;&#xff1a; 步驟3&#xff1a;獲取目標數據庫中的表名 參數解釋&#xff1a; 輸出示例&#…

質數時間(二分查找)

題目描述如果把一年之中的某個時間寫作 a 月 b 日 c 時 d 分 e 秒的形式&#xff0c;當這五個數都為質數時&#xff0c;我們把這樣的時間叫做質數時間&#xff0c;現已知起始時刻是 2022 年的 a 月 b 日 c 時 d 分 e 秒&#xff0c;終止時刻是 2022 年的 u 月 v 日 w 時 x 分 y…

Python訓練Day29

浙大疏錦行 類的裝飾器裝飾器思想的進一步理解&#xff1a;外部修改、動態類方法的定義&#xff1a;內部定義和外部定義

新手DBA實戰指南:如何使用gh-ost實現MySQL無鎖表結構變更

新手DBA實戰指南:如何使用gh-ost實現MySQL無鎖表結構變更 作為DBA,大表結構變更(DDL)一直是令人頭疼的問題。傳統的ALTER TABLE操作會鎖表,嚴重影響業務連續性;而常見的pt-online-schema-change工具雖然能實現在線變更,但依賴觸發器機制,在高并發場景下性能表現不佳。本…

OSPF綜合

一、實驗拓撲二、實驗需求1、R4為ISP&#xff0c;其上只配置IP地址&#xff1b;R4與其他所直連設備間均使用公有IP&#xff1b; 2、R3-R5、R6、R7為MGRE環境&#xff0c;R3為中心站點&#xff1b; 3、整個OSPF環境IP基于172.16.0.0/16劃分&#xff1b;除了R12有兩個環回&#x…

技術面試知識點詳解 - 從電路到編程的全棧面經

技術面試知識點詳解 - 從電路到編程的全棧面經 目錄 模擬電路基礎數字電路原理電源設計相關編程語言基礎數據庫與并發網絡協議基礎算法與數據結構 模擬電路基礎 1. 放大電路類型判斷 這是模擬電路面試的經典題目&#xff0c;通過電壓放大倍數判斷放大電路類型&#xff1a; …

LangGraph認知篇-Command函數

Command簡述 在 LangGraph 中&#xff0c;Command 是一個極具實用性的功能&#xff0c;它能夠將控制流&#xff08;邊&#xff09;和狀態更新&#xff08;節點&#xff09;巧妙地結合起來。這意味著開發者可以在同一個節點中&#xff0c;既執行狀態更新操作&#xff0c;又決定下…

【目標檢測】小樣本度量學習

小樣本度量學習&#xff08;Few-Shot Metric Learning&#xff09;通常用于分類任務?&#xff08;如圖像分類&#xff09;&#xff0c;但它也可以與目標檢測&#xff08;Object Detection&#xff09;結合&#xff0c;解決小樣本目標檢測&#xff08;Few-Shot Object Detectio…

cmd怎么取消關機命令

在 Windows 的命令提示符&#xff08;CMD&#xff09;中取消已計劃的關機操作&#xff0c;可以通過 shutdown 命令的 ?**-a**? 參數實現。以下是具體步驟&#xff1a;?操作方法??打開 CMD?按下 Win R 組合鍵&#xff0c;輸入 cmd 并回車&#xff0c;打開命令提示符窗口。…