【MySQL成神之路】MySQL索引相關介紹

1 相關理論介紹

一、索引基礎概念

二、索引類型

1. 按數據結構分類

2. 按功能分類

三、索引數據結構原理

B+樹索引特點:

哈希索引特點:

四、索引使用原則

1. 創建索引原則

2. 避免索引失效情況

五、索引優化策略

六、索引維護與管理

七、特殊索引注意事項

八、索引與存儲引擎

2、代碼操作示例

一、索引創建方法

1. 創建表時定義索引

?2. 在已有表上創建索引

二、索引使用方法

1. 基本查詢使用索引

2. 覆蓋索引查詢

三、索引優化方法

1. 索引設計原則

2. 索引使用優化

3. 索引維護優化

四、綜合示例


1 相關理論介紹

一、索引基礎概念

索引是MySQL中用于加速查詢的一種數據結構,類似于書籍的目錄。它通過建立額外的數據結構來快速定位數據,避免全表掃描。索引本質上是一種有序的數據結構,MySQL主要使用B+樹作為索引結構。

二、索引類型

1. 按數據結構分類

  • B+樹索引:MySQL最常用的索引類型,適合范圍查詢和排序
  • 哈希索引:Memory引擎默認索引類型,適合等值查詢但不支持范圍查詢
  • 全文索引:用于全文搜索,MyISAM和InnoDB都支持
  • 空間索引:用于地理空間數據,MyISAM支持

2. 按功能分類

  • 普通索引:最基本的索引類型,無特殊限制
  • 唯一索引:索引列值必須唯一但允許NULL值
  • 主鍵索引:特殊的唯一索引,不允許NULL值
  • 復合索引:多個列組合的索引
  • 前綴索引:對字符列前N個字符建立的索引

三、索引數據結構原理

B+樹索引特點:

  1. 所有數據都存儲在葉子節點,非葉子節點只存儲鍵值
  2. 葉子節點通過指針連接形成鏈表,便于范圍查詢
  3. 樹高度通常為3-4層,能支持千萬級數據高效查詢
  4. 查詢時間復雜度為O(log n)

哈希索引特點:

  1. 基于哈希表實現,查詢時間復雜度為O(1)
  2. 只支持等值查詢(=, IN),不支持范圍查詢(>, <, BETWEEN)
  3. 不支持排序操作

四、索引使用原則

1. 創建索引原則

  • 為常用于WHERE條件的列創建索引
  • 為JOIN連接的列創建索引
  • 為ORDER BY、GROUP BY的列創建索引
  • 選擇區分度高的列建立索引
  • 使用短索引,特別是對字符串列
  • 合理使用復合索引,遵循最左前綴原則

2. 避免索引失效情況

  • 在索引列上使用函數或運算
  • 使用!=或<>操作符
  • 使用OR連接條件(可改為IN)
  • 使用前導通配符LIKE '%xxx'
  • 隱式類型轉換導致索引失效
  • 復合索引不遵循最左前綴原則

五、索引優化策略

  1. 覆蓋索引:查詢列都包含在索引中,避免回表操作
  2. 索引下推:MySQL5.6+特性,將WHERE條件下推到存儲引擎層過濾
  3. MRR優化:Multi-Range Read優化,減少隨機IO
  4. ICP優化:Index Condition Pushdown優化
  5. 使用EXPLAIN分析:查看SQL執行計劃,優化索引使用

六、索引維護與管理

  1. 定期分析表(ANALYZE TABLE)更新索引統計信息
  2. 定期優化表(OPTIMIZE TABLE)減少碎片
  3. 監控索引使用情況,刪除無用索引
  4. 避免過多索引,一般不超過表字段數的20%

七、特殊索引注意事項

  1. 自增主鍵:InnoDB推薦使用自增列作為主鍵
  2. 前綴索引:對長字符串列使用前N個字符建立索引
  3. NULL值處理:盡量避免NULL值,可為NULL的列需要額外空間
  4. 外鍵索引:線上OLTP系統慎用外鍵

八、索引與存儲引擎

  1. InnoDB

    • 使用聚簇索引,主鍵作為聚簇索引
    • 二級索引存儲主鍵值
    • 支持事務和行級鎖
  2. MyISAM

    • 使用非聚簇索引,索引和數據分離
    • 只支持表級鎖
    • 支持全文索引

2、代碼操作示例

一、索引創建方法

1. 創建表時定義索引

-- 主鍵索引
CREATE TABLE employee_tbl (emp_id CHAR(9) NOT NULL PRIMARY KEY,emp_name VARCHAR(40) NOT NULL,emp_st_addr VARCHAR(20) NOT NULL,emp_city VARCHAR(15) NOT NULL,emp_st CHAR(2) NOT NULL,emp_zip NUMBER(5) NOT NULL
);-- 多列索引
CREATE TABLE sales (id INT NOT NULL,customer_id INT NOT NULL,amount DECIMAL(10,2),sale_date DATE,PRIMARY KEY (id),INDEX idx_customer_date (customer_id, sale_date)
);

?2. 在已有表上創建索引

-- 普通索引
CREATE INDEX idx_name ON employee_tbl(emp_name);-- 唯一索引
CREATE UNIQUE INDEX idx_zip ON employee_tbl(emp_zip);-- 前綴索引(針對字符串列)
CREATE INDEX idx_city_prefix ON employee_tbl(emp_city(5));

二、索引使用方法

1. 基本查詢使用索引

-- 使用主鍵查詢(自動使用索引)
SELECT * FROM employee_tbl WHERE emp_id = '12345';-- 使用普通索引列查詢
SELECT * FROM employee_tbl WHERE emp_name = 'John Doe';-- 使用多列索引
SELECT * FROM sales WHERE customer_id = 100 AND sale_date = '2025-05-23';

2. 覆蓋索引查詢

-- 如果索引包含所有查詢字段,可以避免回表
CREATE INDEX idx_covering ON sales(customer_id, sale_date, amount);-- 查詢只使用索引列
SELECT customer_id, sale_date FROM sales 
WHERE customer_id = 100 AND sale_date BETWEEN '2025-05-21' AND '2025-05-23';

三、索引優化方法

1. 索引設計原則

優先使用數值類型索引:數值比較比字符串快

-- 不推薦
CREATE INDEX idx_bad ON table(phone_str);-- 推薦:將字符串轉為數字
CREATE INDEX idx_good ON table(CAST(phone_str AS UNSIGNED));

合理使用ENUM/SET

-- 對于有限可能值的字段
ALTER TABLE employee_tbl 
ADD COLUMN gender ENUM('M','F') NOT NULL COMMENT '性別';

避免NULL字段

-- 不推薦
ALTER TABLE employee_tbl ADD COLUMN middle_name VARCHAR(20) NULL;-- 推薦
ALTER TABLE employee_tbl ADD COLUMN middle_name VARCHAR(20) NOT NULL DEFAULT '';

2. 索引使用優化

避免索引列運算

-- 不推薦(索引失效)
SELECT * FROM sales WHERE YEAR(sale_date) = 2025;-- 推薦
SELECT * FROM sales WHERE sale_date BETWEEN '2025-05-23' AND '2025-05-23';

合理使用前綴索引

-- 對長字符串列使用前綴索引
CREATE INDEX idx_name_prefix ON employee_tbl(emp_name(10));

多列索引順序

-- 選擇性高的列在前
CREATE INDEX idx_optimal ON sales(sale_date, customer_id);

3. 索引維護優化

定期分析表

ANALYZE TABLE employee_tbl;

刪除未使用索引

-- 通過性能Schema或慢查詢日志識別未使用索引
DROP INDEX idx_unused ON employee_tbl;

處理索引碎片

OPTIMIZE TABLE employee_tbl;

四、綜合示例

-- 創建優化后的表結構
CREATE TABLE optimized_employee (id INT UNSIGNED NOT NULL AUTO_INCREMENT,emp_code CHAR(8) NOT NULL COMMENT '員工編碼',name VARCHAR(30) NOT NULL,department ENUM('IT','HR','Finance','Sales') NOT NULL,join_date DATE NOT NULL,salary DECIMAL(10,2) NOT NULL DEFAULT 0,status TINYINT NOT NULL DEFAULT 1 COMMENT '0-離職 1-在職',PRIMARY KEY (id),UNIQUE KEY uk_emp_code (emp_code),INDEX idx_department_status (department, status),INDEX idx_name (name(10)),INDEX idx_join_date (join_date)
) ENGINE=InnoDB;-- 查詢示例(充分利用索引)
-- 1. 使用主鍵查詢
SELECT * FROM optimized_employee WHERE id = 100;-- 2. 使用多列索引
SELECT id, name FROM optimized_employee 
WHERE department = 'IT' AND status = 1
ORDER BY join_date DESC;-- 3. 覆蓋索引查詢
SELECT department, COUNT(*) 
FROM optimized_employee
WHERE join_date > '2025-05-23'
GROUP BY department;

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

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

相關文章

五、web安全--XSS漏洞(1)--XSS漏洞利用全過程

本文章僅供學習交流&#xff0c;如作他用所承受的法律責任一概與作者無關1、XSS漏洞利用全過程 1.1 尋找注入點&#xff1a;攻擊者首先需要找到目標網站中可能存在XSS漏洞的注入點。這些注入點通常出現在用戶輸入能夠直接輸出到頁面&#xff0c;且沒有經過適當過濾或編碼的地方…

使用 Shell 腳本實現 Spring Boot 項目自動化部署到 Docker(Ubuntu 服務器)

使用 Shell 腳本實現 Spring Boot 項目自動化部署到 Docker&#xff08;Ubuntu 服務器&#xff09; 在日常項目開發中&#xff0c;我們經常會將 Spring Boot 項目打包并部署到服務器上的 Docker 環境中。為了提升效率、減少重復操作&#xff0c;我們可以通過 Shell 腳本實現自動…

高考加油(Python+HTML)

前言 詢問DeepSeek根據自己所學到的知識來生成多個可執行的代碼&#xff0c;為高考學子加油。最開始生成的都會有點小問題&#xff0c;還是需要自己調試一遍&#xff0c;下面就是完整的代碼&#xff0c;當然了最后幾天也不會有多少人看&#xff0c;都在專心的備考。 Python勵…

HTTP協議接口三種測試方法之-JMeter(保姆教程)

在當今 API 驅動的開發世界中&#xff0c;高效、可靠的 HTTP 接口測試是保障應用質量的關鍵。作為開源性能測試工具中的王者&#xff0c;Apache JMeter 不僅擅長壓力測試&#xff0c;更是進行功能性和回歸測試的利器。本文將手把手教你如何用 JMeter 構建強大的 HTTP 測試計劃&…

聊聊JVM怎么調優?(實戰總結)

JVM 核心配置與調優指南 一、堆內存與年輕代配置&#xff08;影響最大&#xff09; 堆內存大小&#xff1a; 在資源允許的前提下&#xff0c;堆內存應盡可能設置得更大。關鍵點&#xff1a; 必須將堆內存的最大值 (-Xmx) 和最小值 (-Xms) 設置為相同值。動態擴容會觸發 Full G…

開疆智能Profinet轉Profibus網關連接費斯托閥島總線模塊配置案例

本案例是通過開疆智能Profibus轉Profinet網關將費托斯閥島接入到西門子1200PLC的配置案例。 首先我們先了解一下Profibus報文以及他的通訊原理。 除了起始符 SD 和結束符 ED 這些固定數值之外&#xff0c;還有功能碼&#xff08;Function Code, FC&#xff09;和服務訪問點&…

ARM內核一覽

經常看介紹某某牛批芯片用的又是ARM什么核&#xff0c;看的云里霧里&#xff0c;所以簡單整理整理。&#xff08;內容來自官網和GPT&#xff09; 1 ARM 內核總體分類 系列特點應用場景Cortex-M超低功耗、低成本、實時性嵌入式系統、微控制器、IoTCortex-R高可靠性、硬實時汽車…

RT Thread Nano V4.1.1 rtconfig.h 注釋 Configuration Wizard 格式

rtcomfig.h 以下是對 [rtconfig.h](file://c:\Users\admin\Downloads\rtthread-nano-master\rt-thread\bsp\stm32f407-msh\RT-Thread\rtconfig.h) 文件中每一個配置項的詳細注釋說明: 基本配置(Basic Configuration) [RT_THREAD_PRIORITY_MAX](file://c:\Users\admin\Downl…

UniApp網頁版集成海康視頻播放器

注意&#xff1a;本人全部集成好后使用最新的海康平臺下載插件進行替換后就不能預覽視頻 使用Uni插件進行集成&#xff1a;海康視頻H5播放器組件 - DCloud 插件市場 CSDN資源下載&#xff1a;https://download.csdn.net/download/wangdaoyin2010/90910975 注意&#xff1a;初…

WPF【10_2】數據庫與WPF實戰-示例

客戶預約關聯示例圖 MainWindow.xaml 代碼 <Window x:Class"WPF_CMS.MainWindow" xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d"ht…

理解 Kubernetes 的架構與控制平面組件運行機制

文章目錄 K8s架構K8s核心組件控制平面組件&#xff08;部署在 Master 節點&#xff09;1. 查看組件運行情況2. 查看組件 help 命令 Node端組件&#xff08;部署在每個工作節點&#xff09; K8s內部工作原理 Kubernetes&#xff08;也稱為 K8s&#xff09;是一個開源的容器編排和…

Express+MySQL后臺開發實戰:從模塊化到錯誤處理的全鏈路解析

ExpressMySQL后臺開發實戰&#xff1a;從模塊化到錯誤處理的全鏈路解析 摘要&#xff1a;本文將以Node.jsExpress框架為基礎&#xff0c;結合MySQL數據庫實戰&#xff0c;深度剖析后臺系統中數據庫模塊化設計、安全查詢、錯誤處理等核心開發要點。 一、項目環境與技術棧 ├─…

Spring AI 智能體代理模式(Agent Agentic Patterns)

AgentAgenticPatterns 簡介 在最近的一篇研究報告《構建高效代理》 中&#xff0c;Anthropic分享了關于構建高效大語言模型&#xff08;LLM&#xff09;代理的寶貴見解。這項研究特別有趣的地方在于&#xff0c;它強調簡單性和可組合性&#xff0c;而非復雜的框架。讓我們來探…

基于 Vue3 與 exceljs 實現自定義導出 Excel 模板

在開發中&#xff0c;我們需要常常為用戶提供更多的數據錄入方式&#xff0c;Excel 模板導出與導入是一個常見的功能點。本文將介紹如何使用 Vue3、exceljs 和 file-saver 實現一個自定義導出 Excel 模板&#xff0c;并在特定列添加下拉框選擇的數據驗證功能。 技術選型 excelj…

git 命令之-git cherry-pick

今天得到一個通知&#xff0c;這個業務版本里面部分已經開發但還沒測試的內容要新開一個分支提交&#xff0c;但是我已經有幾個提交上去了&#xff0c;難道只能一個一個文件復制到新的分支嗎&#xff1f;我不&#xff0c;我找到了這個git命令&#xff0c;可以解決我的困惑&…

浙大版《Python 程序設計》題目集6-3,6-4,6-5,6-6列表或元組的數字元素求和及其變式(遞歸解法)

目錄 6-3 輸入格式: 輸出格式: 輸入樣例: 輸出樣例: 6-4 輸入格式: 輸出格式: 輸入樣例: 輸出樣例: 6-5 輸入格式: 輸出格式: 輸入樣例: 輸出樣例: 6-6 輸入格式: 輸出格式: 輸入樣例: 輸出樣例: 6-3 第6章-3 列表或元組的數字元素求和 分數 20 全屏瀏覽 切換布局 作者 陳春暉 …

【b站計算機拓荒者】【2025】微信小程序開發教程 - chapter2 小程序核心

1 尺寸單位和樣式 1.1 創建小程序項目-純凈環境 // 該刪的刪掉。 1.2 尺寸單位 # 小程序內 手機屏幕大小可能不一樣&#xff0c;使用px像素就會出現樣式問題 --> 小程序統一了整個寬度&#xff0c;即750rpx&#xff0c;屏幕一半則是375rpx -->因此不管什么手機都可以…

攻防世界逆向刷題筆記(新手模式9-1?)

bad_python 看樣子是pyc文件損壞了。利用工具打開&#xff0c;發現是MAGIC壞了。搜下也沒有頭緒。 攻防世界-難度1- bad_python - _rainyday - 博客園 python Magic Number對照表以及pyc修復方法 - iPlayForSG - 博客園 看WP才知道36已經提示了pyc版本了。參考第二個文章&am…

mysql ACID 原理

序言&#xff1a;ACID 是一組數據庫設計原則&#xff0c;他是業務數據和關鍵業務程序的可靠性保障。 1、atomicity&#xff08;原子性&#xff09; 依賴如下能力 autocommit commit rollback2、一致性 2.1 double write buffer 1、定義&#xff1a;double write buffer 是…

WebStorm 高效快捷方式全解析

作為前端開發的黃金搭檔&#xff0c;WebStorm 憑借強大的功能和高度可定制的快捷鍵體系&#xff0c;成為眾多開發者提升編碼效率的利器。本文基于 IntelliJ IDEA 的快捷鍵體系&#xff08;WebStorm 作為 JetBrains 家族成員&#xff0c;快捷鍵邏輯高度一致&#xff09;&#xf…