MySQL索引:數據庫的超級目錄

MySQL索引:數據庫的「超級目錄」

想象你有一本1000頁的百科全書,要快速找到某個知識點(如“光合作用”):

  • ? 無索引:逐頁翻找 → 全表掃描(慢!)
  • ? 有索引:直接查目錄 → 精準定位(快!)

索引的本質:預先對數據排序+存儲位置信息,加速檢索的特殊數據結構。


一、索引類型及原理

1. 數據結構
索引類型數據結構適用場景特點
B+樹索引多叉平衡樹默認索引(InnoDB)范圍查詢快,適合磁盤存儲
哈希索引哈希表精確匹配(Memory引擎)等值查詢極快,不支持范圍查詢
全文索引倒排索引文本搜索(MATCH AGAINST解決LIKE '%word%'低效問題

📌 B+樹為什么快?

  • 葉子節點形成鏈表 → 范圍查詢高效(如WHERE id > 100
  • 非葉子節點只存索引 → 單節點存儲更多key
  • 所有數據在葉子節點 → 查詢路徑長度一致
2. 邏輯分類
索引類型描述示例
主鍵索引唯一標識,不允許NULLPRIMARY KEY (id)
唯一索引保證列值唯一,允許NULLUNIQUE KEY (email)
普通索引加速查詢,允許重復值INDEX (name)
聯合索引多列組合索引INDEX (city, age)

二、索引生效與失效場景

? 生效場景
-- 1. 全值匹配  
SELECT * FROM users WHERE name = 'Alice';  -- 2. 最左前綴原則(聯合索引)  
INDEX (a, b, c)  -- 生效: WHERE a=? / WHERE a=? AND b=? / WHERE a=? AND b=? AND c=?  -- 3. 范圍查詢(部分生效)  
SELECT * FROM orders WHERE amount > 100 AND status = 1;  -- (amount)索引生效  -- 4. 覆蓋索引(直接從索引拿數據)  
SELECT id FROM products WHERE price > 50;  -- 索引包含(id,price)  
? 失效場景
-- 1. 違反最左前綴  
INDEX (a, b, c)  
WHERE b = 2;     -- ? 索引失效  -- 2. 對索引列運算  
WHERE YEAR(create_time) = 2023;  -- ? 改用: create_time BETWEEN '2023-01-01' AND '2023-12-31'  -- 3. 隱式類型轉換  
WHERE phone = 13800138000;  -- ? phone是varchar類型  -- 4. LIKE左模糊  
WHERE name LIKE '%Lee';     -- ? 全表掃描  -- 5. OR條件未全覆蓋  
WHERE age = 18 OR name = 'Bob';  -- 若name無索引 → 全表掃描  

三、索引優化策略

1. EXPLAIN診斷工具
EXPLAIN SELECT * FROM employees WHERE department_id = 3;  

關鍵指標:

  • typesystem > const > ref > range > index > ALL(性能從優到差)
  • key:實際使用的索引
  • rows:掃描行數(越小越好)
2. 設計原則
策略說明
只為高頻查詢建索引避免維護成本(增刪改變慢)
短字段優先整型索引比字符串快,考慮用city_code代替city_name
避免冗余索引INDEX(a,b)INDEX(a) 同時存在 → 后者冗余
前綴索引長文本可截取前N字符:ALTER TABLE t ADD INDEX (text_col(10))
3. 慢查詢優化示例

問題SQL

SELECT * FROM logs WHERE user_id = 1001 AND DATE(create_time) = '2023-10-01';  

優化步驟

  1. 避免對create_time計算 → 改用范圍查詢
  2. 建立聯合索引(user_id, create_time)
-- 優化后  
SELECT * FROM logs  
WHERE user_id = 1001  AND create_time >= '2023-10-01 00:00:00'  AND create_time < '2023-10-02 00:00:00';  

四、索引的代價

  • 空間代價:索引占用額外存儲(特別是B+樹的非葉子節點)
  • 時間代價
    • INSERT:需更新索引 → 性能下降約10%
    • UPDATE:若修改索引列 → 觸發索引重組
    • DELETE:標記刪除 → 產生索引碎片

💡 黃金法則
不要為小表建索引(全表掃描更快)
中大型表重點優化WHERE和JOIN列


五、高級技巧

1. 索引下推(ICP)

MySQL 5.6+

INDEX (age, city)  
SELECT * FROM users WHERE age > 20 AND city = 'Beijing';  
  • 舊版本:先按age>20回表查數據 → 再過濾city
  • 開啟ICP:在索引層直接過濾city減少回表次數
2. 覆蓋索引優化
-- 原始查詢  
SELECT id, name FROM products WHERE category = 'Electronics';  -- 優化方案:  
ALTER TABLE products ADD INDEX (category, id, name);  -- 覆蓋索引  

數據直接從索引返回 → 避免回表查主鍵


總結:索引使用指南

  1. 建索引前問3個問題

    • 數據量是否足夠大?
    • 查詢頻率是否高?
    • 該字段過濾性是否好?(如性別字段不適合單獨建索引)
  2. 優先考慮

    • WHERE條件列、JOIN關聯列、ORDER BY排序列
  3. 定期維護

    ANALYZE TABLE users;       -- 更新索引統計信息  
    OPTIMIZE TABLE orders;     -- 重建表+索引(解決碎片問題)  
    

🚨 最后警告
索引不是越多越好

  • 表數據量<1萬 → 通常不需要索引
  • 每增加一個索引 → INSERT速度降低約10%

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

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

相關文章

景觀橋 涵洞 城門等遮擋物對汽車安全性的影響數學建模和計算方法,需要收集那些數據

對高速公路景觀橋影響行車視距的安全問題進行數學建模&#xff0c;需要將物理幾何、動力學、概率統計和交通流理論結合起來。以下是分步驟的建模思路和關鍵模型&#xff1a;一、 核心建模目標 量化視距&#xff08;Sight Distance, SD&#xff09;&#xff1a;計算實際可用視距…

Git 用戶名和郵箱配置指南:全局與項目級設置

查看全局配置 git config --global user.name # 查看全局name配置 git config --global user.email # 查看全局email配置 git config --global --list # 查看所有全局配置查看當前項目配置 git config user.name # 查看當前項目name配置 git config user.email # 查看當前項目…

視頻序列和射頻信號多模態融合算法Fusion-Vital解讀

視頻序列和射頻信號多模態融合算法Fusion-Vital解讀概述模型整體流程視頻幀時間差分歸一化TSM模塊視頻序列特征融合模塊跨模態特征融合模塊概述 最近看了Fusion-Vital的視頻-射頻&#xff08;RGB-RF&#xff09;融合Transformer模型。記錄一下&#xff0c;對于實際項目中的多模…

frp內網穿透下創建FTP(解決FTP“服務器回應不可路由的地址。使用服務器地址替代”錯誤)

使用寶塔面板&#xff0c;點擊FTP&#xff0c;下載Pure-FTPd插件 點擊Pure-FTPd插件&#xff0c;修改配置文件&#xff0c;找到PassivePortRange, 修改ftp被動端口范圍為39000 39003&#xff0c;我們只需要4個被動端口即可&#xff0c;多了不好在內網穿透frp的配置文件中增加…

STM32控制四自由度機械臂(SG90舵機)(硬件篇)(簡單易復刻)

1.前期硬件準備 2s鋰電池一個&#xff08;用于供電&#xff09;&#xff0c;stm32f103c8t6最小系統板一個&#xff08;主控板&#xff09;&#xff0c;兩個搖桿&#xff08;用于搖桿模式&#xff09;&#xff0c;四個電位器&#xff08;用于示教器模式&#xff09;&#xff0c…

華為OD機試_2025 B卷_最差產品獎(Python,100分)(附詳細解題思路)

題目描述 A公司準備對他下面的N個產品評選最差獎&#xff0c; 評選的方式是首先對每個產品進行評分&#xff0c;然后根據評分區間計算相鄰幾個產品中最差的產品。 評選的標準是依次找到從當前產品開始前M個產品中最差的產品&#xff0c;請給出最差產品的評分序列。 輸入描述 第…

飛算JavaAI:重塑Java開發效率的智能引擎

飛算JavaAI:重塑Java開發效率的智能引擎 一、飛算JavaAI核心價值 飛算JavaAI是全球首款專注Java語言的智能開發助手,由飛算數智科技(深圳)有限公司研發。它通過AI大模型技術實現: 全流程自動化:從需求分析→軟件設計→代碼生成一氣呵成工程級代碼輸出:生成包含配置類、…

Java和Go各方面對比:現代編程語言的深度分析

Java和Go各方面對比&#xff1a;現代編程語言的深度分析 引言 在當今的軟件開發領域&#xff0c;選擇合適的編程語言對項目的成功至關重要。Java作為一門成熟的面向對象語言&#xff0c;已經在企業級開發中占據主導地位超過25年。而Go&#xff08;Golang&#xff09;作為Google…

CloudCanal:一款企業級實時數據同步、遷移工具

CloudCanal 是一款可視化的數據同步、遷移工具&#xff0c;可以幫助企業構建高質量數據管道&#xff0c;具備實時高效、精確互聯、穩定可拓展、一站式、混合部署、復雜數據轉換等優點。 應用場景 CloudCanal 可以幫助企業實現以下數據應用場景&#xff1a; 數據同步&#xff…

如何發現 Redis 中的 BigKey?

如何發現 Redis 中的 BigKey&#xff1f; Redis 因其出色的性能&#xff0c;常被用作緩存、消息隊列和會話存儲。然而&#xff0c;在 Redis 的使用過程中&#xff0c;BigKey 是一個不容忽視的問題。BigKey 指的是存儲了大量數據或包含大量成員的鍵。它們不僅會占用大量內存&…

Golang讀取ZIP壓縮包并顯示Gin靜態html網站

Golang讀取ZIP壓縮包并顯示Gin靜態html網站Golang讀取ZIP壓縮包并顯示Gin靜態html網站1. 讀取ZIP壓縮包2. 解壓并保存靜態文件3. 設置Gin靜態文件服務基本靜態文件服務使用StaticFS更精細控制單個靜態文件服務4. 完整實現示例5. 高級優化內存映射優化使用Gin-Static中間件6. 部…

參數列表分類法:基本參數與擴展參數的設計模式

摘要 本文提出了我設計的一種新的函數參數設計范式——參數列表分類法&#xff0c;將傳統的"單一參數列表"擴展為"多參數列表協同"模式。通過引入"基本參數列表"和"擴展參數列表"的概念&#xff0c;為復雜對象構建提供了更靈活、更具表…

Ajax之核心語法詳解

Ajax之核心語法詳解一、Ajax的核心原理與優勢1.1 什么是Ajax&#xff1f;1.2 Ajax的優勢二、XMLHttpRequest&#xff1a;Ajax的核心對象2.1 XHR的基本使用流程2.2 核心屬性與事件解析2.2.1 readyState&#xff1a;請求狀態2.2.2 status&#xff1a;HTTP狀態碼2.2.3 響應數據屬性…

ArcGIS 打開 nc 降雨量文件

1. 打開ArcToolbox&#xff0c;依次打開 多維工具 → 創建 NetCDF 柵格圖層&#xff0c;將 nc 文件拖入 輸入 NetCDF 文件輸入框&#xff0c;確認 X維度&#xff08;經度&#xff09;、Y維度&#xff08;經度&#xff09; 的變量名是否正確&#xff0c;點擊 確定。圖 1 加載nc文…

01-elasticsearch-搭個簡單的window服務-ik分詞器-簡單使用

1、elasticsearch下載地址 如果是其他版本可以嘗試修改鏈接中的版本信息下載 https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.6.2-windows-x86_64.zip 2、ik分詞器下載地址 ik分詞器下載的所有版本地址&#xff1a;Index of: analysis-ik/stable/…

[數據結構與算法] 優先隊列 | 最小堆 C++

下面是關于 C 中 std::priority_queue 的詳細說明&#xff0c;包括初始化、用法和常見的應用場景。什么是 priority_queue&#xff1f; priority_queue&#xff08;優先隊列&#xff09;是 C 標準庫中的一個容器適配器。它和普通隊列&#xff08;queue&#xff09;最大的不同在…

零基礎入門物聯網-遠程門禁開關:硬件介紹

一、成品展示 遠程門禁最終效果 二、項目介紹 整個項目主要是實際使用案例為主&#xff0c;根據自己日常生活中用到物聯網作品為原型&#xff0c;通過項目實例快速理解。項目分為兩部分&#xff1a;制作體驗和深入學習。 制作體驗部分 會提供所有項目資料及制作說明文檔&a…

軟件系統國產化改造開發層面,達夢(DM)數據庫改造問題記錄

本系統前&#xff08;vue&#xff09;后端(java spring boot)為列子&#xff0c;數據庫由MySQL--->DM&#xff08;達夢&#xff09;&#xff0c;中間件為中創的國產化相關軟件&#xff0c;如tomcat、nginx、redis等。重點講數據庫及代碼端的更改&#xff0c;中間件在服務端以…

N8N與Dify:自動化與AI的完美搭配

“N8N”和“Dify”這兩個工具徹底理清楚&#xff0c;它們其實是兩個定位完全不同的開源平臺&#xff0c;各自擅長解決不同類型的問題&#xff0c;但也能協同工作。以下是詳細說明&#xff1a;1. n8n&#xff1a;工作流自動化平臺定位&#xff1a;n8n 是一個專注于跨系統連接與任…

ARM匯編編程(AArch64架構)課程 - 第5章函數調用規范

目錄AAPCS64調用約定參數傳遞規則返回值規則棧幀管理SP寄存器FP寄存器 (X29)棧幀布局示例AAPCS64調用約定 ARM Architecture Procedure Call Standard for 64-bit (AAPCS64) 參數傳遞規則 參數位置寄存器分配特殊規則參數1-8X0-X7 (64-bit) / W0-W7 (32-bit)浮點數使用 V0-V7參…