MySQL 數據庫索引詳解

一、索引是什么?能干嘛?

類比理解:索引就像書的目錄。比如你想查《哈利波特》中 “伏地魔” 出現的頁數,不用逐頁翻書,直接看目錄找關鍵詞就行。數據庫里的索引就是幫你快速找到數據的 “目錄”。

核心作用:

  • 提速查詢:把 “全表掃描”(逐行找數據)變成 “精準定位”,查詢速度從 “翻完整本書” 變成 “查目錄找頁碼”。
  • 約束數據:比如主鍵索引能保證數據不重復(像身份證號唯一)。
  • 加速排序:索引本身是有序的,排序時不用臨時整理數據。

二、索引的 4 種主要類型(附通俗例子)

1. BTree 索引(最常用的 “萬能索引”)

  • 原理:像字典的拼音目錄,按順序排列(如 a-b-c...),支持范圍查詢(如查 “年齡> 18”)和精準查詢。
  • 適用場景:90% 的場景都能用,比如:
    CREATE INDEX idx_age ON users(age);  -- 給年齡字段建索引
    
  • 類比:查字典時,知道 “張三” 的拼音,直接按字母順序翻到對應頁。

2. Hash 索引(“快速匹配器”)

  • 原理:把數據變成 “哈希值”(類似快遞單號),查數據時直接 “對單號”,速度極快(O (1))。
  • 限制:只能精準匹配(如WHERE id=1),不能查范圍(如id>100),且僅內存表(MEMORY 引擎)可用。
  • 類比:快遞柜取件,輸入單號直接開門,無法 “找所有單號大于 100 的快遞”。

3. 全文索引(“文本搜索神器”)

  • 原理:專門針對文章、評論等長文本,把關鍵詞拆分成 “詞條” 存儲(類似搜索引擎的關鍵詞索引)。
  • 適用場景:查 “包含‘MySQL’的文章”,用MATCH AGAINST語句:
    CREATE FULLTEXT INDEX idx_article ON articles(content);
    
  • 注意:MySQL 5.7 + 優化后性能更好,別用 LIKE '% 關鍵詞 %'(太慢)。

4. 空間索引(“地圖專用索引”)

  • 原理:存儲地理坐標(如經緯度),支持 “查找附近 5 公里的咖啡店” 這類查詢。
  • 適用場景:外賣 APP 找附近商家、地圖軟件標地點。
  • 限制:字段必須是 GEOMETRY 類型(如點、線、面),InnoDB 引擎從 5.7 開始支持。

三、啥時候該建索引?啥時候別建?

? 建議建索引的情況:

  1. 經常用來查詢的字段:比如WHERE name='張三'中的 name 字段。
  2. 表關聯字段:多表 JOIN 時的關聯字段(如訂單表的 user_id 關聯用戶表)。
  3. 唯一性字段:主鍵(id)、郵箱(唯一不重復)。
  4. 頻繁排序的字段:如ORDER BY create_time,索引自帶順序,不用額外排序。

? 不建議建索引的情況:

  1. 數據重復率高的字段:比如 “性別”(只有男 / 女),建索引還不如直接全表掃描快。
  2. 頻繁更新的字段:比如 “在線狀態”,每次修改都要更新索引,影響性能。
  3. 小表數據:表只有 100 行數據,全表掃描比查索引更快(索引本身也占空間)。
  4. 不參與查詢的字段:建了索引也用不上,純屬浪費空間。

四、復合索引:多個字段 “組隊” 加速查詢

1. 什么是復合索引?

  • 給多個字段一起建索引,比如(name, age),相當于 “組合目錄”。
  • 語法:
    CREATE INDEX idx_name_age ON users(name, age);
    

2. 最左前綴原則(必須掌握!)

  • 規則:查詢條件必須從左到右使用索引中的字段,不能跳過。
  • 示例:索引是(name, age),支持:
    WHERE name='張三' AND age=18;  -- 正確,用全索引
    WHERE name='張三';  -- 正確,用name部分
    

    不支持:
    WHERE age=18;  -- 錯誤,跳過了name,索引失效
    WHERE name='張三' AND age=18 AND address='北京';  -- 正確,address不影響,前兩個字段用上索引
    
  • 類比:索引像 “省 - 市 - 區” 的地址,你必須先指定 “省”,才能用索引快速定位,直接查 “區” 無法用索引。

五、索引優化:讓查詢飛起來的技巧

1. 覆蓋索引:“不回表” 的高效查詢

  • 定義:查詢的所有字段都在索引里,不用再回表查數據(類似查目錄時直接拿到所有需要的信息,不用翻書)。
  • 示例
    -- 表結構:users(id, name, age)
    CREATE INDEX idx_name_age ON users(name, age);  -- 索引包含name和age
    SELECT name, age FROM users WHERE name='張三';  -- 直接從索引取數據,不用回表
    

2. 索引失效場景(避坑指南)

  • 用了函數或表達式
    WHERE UPPER(name)='ZHANGSAN';  -- 對name做了大寫轉換,索引失效
    
  • 類型不匹配
    WHERE id='123';  -- id是數字類型,傳字符串可能導致索引失效
    
  • 模糊查詢以通配符開頭
    WHERE name LIKE '%張三';  -- 無法用索引(不知道從哪開始查)
    
  • OR 條件分隔無關聯字段
    WHERE id=1 OR name='張三';  -- 若id和name沒有共同索引,可能失效
    

3. 索引管理命令(常用)

  • 創建索引
    CREATE INDEX idx_name ON users(name);  -- 普通索引
    CREATE UNIQUE INDEX idx_email ON users(email);  -- 唯一索引
    
  • 刪除索引
    DROP INDEX idx_name ON users;
    
  • 查看索引
    SHOW INDEX FROM users;
    
  • 分析查詢是否用索引
    EXPLAIN SELECT * FROM users WHERE name='張三';  -- 看執行計劃中的Key列
    

六、不同引擎的索引差異(簡單了解)

引擎支持的索引類型特點
InnoDBBTree、全文、空間數據和索引存一起(聚簇索引),適合事務
MyISAMBTree、全文、RTree索引和數據分開存,不支持事務
MemoryHash、BTree數據在內存,查詢極快,但重啟數據丟失

七、實戰案例:電商訂單表索引優化

場景:

查詢 “近 30 天內,已支付(status=2)且金額> 1000 的訂單”,按時間倒序。

表結構:

CREATE TABLE orders (id BIGINT PRIMARY KEY,user_id BIGINT,order_time DATETIME,status TINYINT,amount DECIMAL(10,2)
);

優化方案:

  1. 創建聯合覆蓋索引
    CREATE INDEX idx_status_time_amount ON orders(status, order_time, amount);
    
  2. 查詢語句
    SELECT id, user_id, amount FROM orders 
    WHERE status=2 AND order_time >= NOW() - INTERVAL 30 DAY AND amount > 1000
    ORDER BY order_time DESC;
    

優化原理:

  • 聯合索引(status, order_time, amount)滿足最左前綴原則,先按狀態篩選,再按時間和金額過濾。
  • order_time在索引中是有序的,查詢時直接按倒序取,不用額外排序。
  • 查詢字段id, user_id, amount都在索引中(id是主鍵,默認在索引里),實現覆蓋索引,不回表。

八、索引使用的核心原則(必記!)

  1. 少而精:單表索引不超過 5 個,避免過度索引(每個索引都增加寫入開銷)。
  2. 聯合索引優先:多個字段頻繁一起查詢時,建聯合索引比多個單列索引更高效。
  3. 覆蓋索引優先:讓查詢字段盡量在索引中,減少 “回表” 操作。
  4. 定期維護:用ANALYZE TABLE更新索引統計信息,用EXPLAIN分析慢查詢是否用了索引。
  5. 避免坑點:不用函數處理字段、不寫SELECT *(只查需要的字段)、模糊查詢用LIKE '關鍵詞%'(別以通配符開頭)。

通過合理設計索引,MySQL 查詢性能能提升 10-100 倍!但記住:索引不是越多越好,要在 “查詢速度” 和 “寫入速度” 之間找平衡哦~

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

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

相關文章

【620公司工作記錄】

已有數據匯總 好的,完全同意。在編寫新代碼之前,清晰地盤點我們手中已有的“彈藥”是至關重要的一步。 根據您提供的 test/20250610_88_100mm_frame_000.csv 文件頭,我來為您完整地解析一下我們當前擁有的全部數據字段。我們的數據是以“行”為單位組織的,每一行都代表一…

SpringBoot 集成Caffeine實現一級緩存

SpeingBoot 集成Caffeine實現一級緩存使我們經常遇到的場景。今天我們具體分享一下: 首先 Caffeine 作為一級緩存,它是 Spring 5.x 默認的本地緩存實現,性能優于 Guava Cache,且支持過期時間設置。緩存執行的流程圖如下&#xff…

中科米堆3D自動掃描檢測系統三維數字化智能解決方案

3D自動掃描檢測系統基于先進的光學、激光或結構光等測量技術,能夠快速、準確地獲取工件的三維幾何數據。在檢測過程中,系統通過向被測工件投射特定的光模式,利用高分辨率相機捕捉工件表面的反射光信息,再經過復雜的算法處理&#…

Unity3d中使用Mirror進行自定義消息通信

一、服務端: 1.創建服務端腳本MyServer.cs 繼承自NetworkManager類 using Mirror; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;public class MyServer : NetworkManager {[Header(&quo…

Odoo 18 固定資產管理自動化指南

如何在Odoo 18中實現資產管理自動化 1. 創建資產模型實現資產管理自動化 使用 Odoo 18 的會計模塊,資產的創建和確認可輕松實現自動化。這將使資產管理變得更加簡單高效。使用資產自動化功能,一旦驗證相關產品的供應商賬單,Odoo將自動生成并…

如何輕松地將音樂從 iPhone 傳輸到 Mac?

想把音樂從 iPhone 傳輸到 Mac 嗎?這很常見,無論你是想更換設備、備份收藏,還是只想在更大的屏幕上欣賞喜愛的歌曲。幸運的是,有 6 種有效的方法可以完成這項工作,具體取決于你喜歡使用的工具。讓我們開始吧。 第 1 部…

人工智能——解讀AI智慧課堂系統解決方案【附全文閱讀】

該文檔是 AI 智慧課堂系統解決方案,聚焦教育信息化需求,通過 AI 技術與教學深度融合,解決傳統課堂考勤效率低、資源管理難、分析不精準等問題。 方案以課堂為核心,構建 “背景分析 - 方案設計 - 優勢價值” 框架,技術架構涵蓋教師攝像機、學生抓拍機、智能錄播主機等設備,…

使用Nginx的RTMP模塊進行直播流轉HLS時,處理和預防`.ts`文件過多

當使用Nginx的RTMP模塊進行直播流轉HLS時,如果長時間運行或處理大量流媒體內容,可能會遇到.ts文件累積過多的問題。這不僅會占用大量的磁盤空間,還可能影響系統性能。以下是一些處理和預防.ts文件過多的方法: 1. 配置HLS清理 Nginx RTMP模塊允許配置HLS片段的過期時間,這…

結構體解決冒泡排序

設計英雄的結構體 //1、設計結構體 struct Hero {string name;//姓名int age;//年齡string sex;//性別 };創建英雄的數組 //2、創建數組存放英雄 struct Hero Array[5] {{"劉備", 34 ,"男"},{"關羽", 45 ,"男"},{"張飛",…

spring-webmvc @RequestParam 典型用法

典型用法 基本使用 HTTP請求參數綁定到方法參數 GetMapping("/users") public String getUsers(RequestParam String name) {return "Hello, " name; }請求:/users?nameJohn 輸出:Hello, John-----GetMapping("/filter&qu…

AntDesignPro前后端權限按鈕系統實現

目錄 Ant Design Pro 后端接口權限按鈕系統 系統架構圖 前端實現 權限按鈕組件 (AuthButton.tsx) 權限鉤子 (useAccess.ts) 權限服務 (permission.ts) 產品列表頁面 (ProductList.tsx) 后端接口設計 (Node.js Express 示例) 權限接口控制器 (permissionController.js…

RAG工程落地:處理文檔中表格數據

在 RAG(Retrieval-Augmented Generation)工程落地過程中,處理文檔中的表格數據 是一個非常重要但復雜的問題,特別是針對技術文檔、報告、論文等結構化強的資料。比如PDF文檔里的表格數據,如下: RAG處理表格…

大模型在肺癌預測及個性化診療方案中的應用研究

目錄 一、引言 1.1 研究背景與意義 1.2 研究目的與創新點 1.3 國內外研究現狀 二、大模型預測肺癌的原理與方法 2.1 大模型概述 2.2 數據收集與預處理 2.3 特征工程 2.4 模型訓練與優化 三、術前預測與方案制定 3.1 病情評估 3.1.1 腫瘤大小、位置及分期預測 3.1.…

如何高效分享WordPress博客文章

在當今信息過載的時代,寫好一篇優秀的 WordPress 博客文章只是起點,如何有效地分享給更多讀者才是成功的關鍵所在。對于新手用戶而言,選擇合適的工具和平臺尤為重要。現在許多服務器提供商支持一鍵安裝WordPress功能,比如 Hosteas…

以孝治家有機農業生態文明考察組赴邯鄲心田農場考察學習

按照2025年中共中央、國務院印發了關于《鄉村全面振興規劃(2024—2027年)》的戰略部署。根據《鄉村全面振興規劃》提出的“堅持人與自然和諧共生。牢固樹立和踐行綠水青山就是金山銀山的理念,落實節約優先、保護優先、自然恢復為主的方針&…

解決el-input無法輸入的問題 vue2+element el-input

問題描述: 在el-dialog中el-form組件來做表單提交 中文輸入模式: 在初次輸入的時候能輸入內容 但是再次輸入無法更改內容 英文輸入模式: 只能輸入一個英文 很多文章都是說 是雙向綁定的問題 但是我仔細看了 變量的雙向綁定確實沒毛病 直到我發現了是因為我el-input中的圖…

16_集成學習

描述 集成學習(Ensemble Learning)是一種通過結合多個模型的預測結果來提高整體性能的技術。集成學習的核心思想是通過多個弱學習器的組合,可以構建一個強學習器。 sklearn中常見的集成學習算法: Bagging:通過自助采…

學習STC51單片機43(芯片為STC89C52RCRC)智能小車9(語音識別小車)

每日一言 不必與他人比較速度,你走的每一步都在書寫自己的傳奇。 案例:語音識別小車 這個是最后一個功能了,其實就是用語音功能讓小車自己切換各種模式,當然了我們需要先學習一下語音模塊 硬件:SU-03T 這個叫做非特定…

Android 中 解析 XML 字符串的幾種方式

在 Android 開發中,解析 XML 文件有多種方式,每種方式都有其特點和適用場景。常見的 XML 解析方式有 DOM 解析、SAX 解析 和 XmlPullParser 解析。 1、DOM 解析 DOM(Document Object Model)解析是一種基于樹結構的解析方式&#…

云端算力革命:川翔云電腦如何重新定義創作自由

在設計與科技深度融合的時代,高性能硬件的桎梏正成為創意釋放的最大障礙。川翔云電腦以云端算力為支點,通過彈性算力、高效存儲、多端接入三大核心優勢,讓頂級 GPU 資源觸手可及。 一、核心優勢:突破物理極限的云端工作站 彈性算…