SQL 索引優化指南:原理、知識點與實踐案例

SQL 索引優化指南:原理、知識點與實踐案例

索引的基本原理

索引是數據庫中用于加速數據檢索的數據結構,類似于書籍的目錄。它通過創建額外的數據結構來存儲部分數據,使得查詢可以快速定位到所需數據而不必掃描整個表。

索引的工作原理

  1. B-Tree/B+Tree索引(最常見):
    • 平衡樹結構,保證查詢效率穩定
    • 適合范圍查詢和精確查詢
    • InnoDB使用B+Tree,非葉子節點只存鍵值,葉子節點存儲數據
  2. 哈希索引
    • 基于哈希表實現
    • 適合等值查詢,O(1)時間復雜度
    • 不支持范圍查詢
  3. 全文索引
    • 用于文本內容的搜索
    • 支持模糊匹配和關鍵詞搜索

索引優化的關鍵知識點

1. 索引類型選擇

  • 普通索引:最基本的索引,無特殊限制
  • 唯一索引:確保列值唯一
  • 主鍵索引:特殊的唯一索引,不允許NULL值
  • 復合索引:多列組合的索引
  • 覆蓋索引:索引包含查詢所需的所有字段

2. 索引創建原則

  • 選擇性高的列:區分度高的列(如用戶ID)比區分度低的列(如性別)更適合建索引
  • 常用查詢條件:WHERE、JOIN、ORDER BY、GROUP BY中的列
  • 避免過度索引:索引會占用空間并降低寫入性能
  • 短索引優先:特別是對字符串列,可考慮前綴索引

3. 索引失效的常見場景

  • 使用!=<>操作符
  • 對索引列使用函數或運算:WHERE YEAR(create_time) = 2023
  • 類型不匹配的查詢:字符串列用數字查詢
  • 使用OR條件(除非所有OR條件都有索引)
  • 模糊查詢以通配符開頭:LIKE '%abc'
  • 不符合最左前綴原則的復合索引使用

索引優化實踐案例

案例1:選擇合適的索引列

問題SQL

SELECT * FROM users WHERE age > 20 AND status = 'active' ORDER BY create_time DESC;

優化方案

-- 創建復合索引
ALTER TABLE users ADD INDEX idx_age_status_createtime (age, status, create_time);-- 如果status='active'的數據很少,可以調整順序
ALTER TABLE users ADD INDEX idx_status_age_createtime (status, age, create_time);

案例2:避免索引失效

問題SQL

SELECT * FROM orders WHERE DATE_FORMAT(create_time, '%Y-%m-%d') = '2023-01-01';

優化方案

下載

-- 改為范圍查詢,避免對列使用函數
SELECT * FROM orders 
WHERE create_time >= '2023-01-01 00:00:00' 
AND create_time < '2023-01-02 00:00:00';

案例3:利用覆蓋索引

問題SQL

SELECT user_id, username FROM users WHERE email = 'user@example.com';

優化方案

-- 創建覆蓋索引
ALTER TABLE users ADD INDEX idx_email_username (email, username);-- 查詢只需掃描索引,不需回表

案例4:復合索引的最左前綴原則

問題SQL

SELECT * FROM products WHERE category = 'electronics' AND price > 1000;

現有索引INDEX (price, category)

優化方案

-- 調整索引列順序以匹配查詢模式
ALTER TABLE products ADD INDEX idx_category_price (category, price);

高級索引優化技術

  1. 索引下推(ICP):MySQL 5.6+,將WHERE條件推送到存儲引擎層過濾
  2. MRR優化:多范圍讀取,減少隨機IO
  3. 索引合并:對多個單列索引的條件進行合并
  4. 自適應哈希索引:InnoDB自動為頻繁訪問的頁創建哈希索引

監控與維護索引

  1. 查看索引使用情況

    SELECT * FROM sys.schema_index_statistics 
    WHERE table_schema = 'your_db' AND table_name = 'your_table';-- 或使用EXPLAIN分析查詢
    EXPLAIN SELECT * FROM users WHERE username = 'test';
    
  2. 定期維護索引

    ANALYZE TABLE your_table;  -- 更新索引統計信息
    OPTIMIZE TABLE your_table; -- 重建表,整理碎片
    
  3. 刪除無用索引

    DROP INDEX index_name ON table_name;
    

通過合理設計和優化索引,可以顯著提高數據庫查詢性能,但需要平衡查詢性能和寫入開銷,定期監控和調整索引策略是關鍵

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

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

相關文章

typedef unsigned short uint16_t; typedef unsigned int uint32_t;

你提到的這兩行是 C/C 中的類型別名定義&#xff1a; typedef unsigned short uint16_t; typedef unsigned int uint32_t;它們的目的是讓代碼更具可讀性和可移植性&#xff0c;尤其在處理精確位數的整數時非常有用。 ? 含義解釋 typedef unsigned short uint16_t;…

Hapi.js知識框架

一、Hapi.js 基礎 1. 核心概念 企業級Node.js框架&#xff1a;由Walmart團隊創建&#xff0c;現由社區維護 配置驅動&#xff1a;強調聲明式配置而非中間件 插件架構&#xff1a;高度模塊化設計 安全優先&#xff1a;內置安全最佳實踐 豐富的生態系統&#xff1a;官方維護…

【PostgreSQL數據分析實戰:從數據清洗到可視化全流程】金融風控分析案例-10.3 風險指標可視化監控

&#x1f449; 點擊關注不迷路 &#x1f449; 點擊關注不迷路 &#x1f449; 點擊關注不迷路 文章大綱 PostgreSQL金融風控分析之風險指標可視化監控實戰一、引言二、案例背景三、數據準備&#xff08;一&#xff09;數據來源與字段說明&#xff08;二&#xff09;數據清洗 四、…

屏幕與觸摸調試

本章配套視頻介紹: 《28-屏幕與觸摸設置》 【魯班貓】28-屏幕與觸摸設置_嗶哩嗶哩_bilibili LubanCat-RK3588系列板卡都支持mipi屏以及hdmi顯示屏的顯示。 19.1. 旋轉觸摸屏 參考文章 觸摸校準 參考文章 旋轉觸摸方向 配置觸摸旋轉方向 1 2 # 1.查看觸摸輸入設備 xinput…

AbstractQueuedSynchronizer之AQS

一、前置知識 公平鎖和非公平鎖&#xff1a; 公平鎖&#xff1a;鎖被釋放以后&#xff0c;先申請的線程先得到鎖。性能較差一些&#xff0c;因為公平鎖為了保證時間上的絕對順序&#xff0c;上下文切換更頻繁 非公平鎖&#xff1a;鎖被釋放以后&#xff0c;后申…

內存泄漏系列專題分析之十一:高通相機CamX ION/dmabuf內存管理機制Camx ImageBuffer原理

【關注我,后續持續新增專題博文,謝謝!!!】 上一篇我們講了:內存泄漏系列專題分析之八:高通相機CamX內存泄漏&內存占用分析--通用ION(dmabuf)內存拆解 這一篇我們開始講: 內存泄漏系列專題分析之十一:高通相機CamX ION/dmabuf內存管理機制Camx ImageBuf…

《類和對象(下)》

引言&#xff1a; 書接上回&#xff0c;如果說類和對象&#xff08;上&#xff09;是入門階段&#xff0c;類和對象&#xff08;中&#xff09;是中間階段&#xff0c;那么這次的類和對象&#xff08;下&#xff09;就可以當做類和對象的補充及收尾。 一&#xff1a;再探構造…

Java MVC

在軟件開發中&#xff0c;MVC&#xff08;Model-View-Controller&#xff09;是一種常用的設計模式&#xff0c;它將應用程序分為三個核心部分&#xff1a;模型&#xff08;Model&#xff09;、視圖&#xff08;View&#xff09;和控制器&#xff08;Controller&#xff09;。這…

嵌入式學習筆記 - 關于單片機的位數

通常我們經常說一個單片機是8位的&#xff0c;16位的&#xff0c;32位的&#xff0c;那么怎么判斷一款單片機的位數是多少位呢&#xff0c;判斷的依據是什么呢&#xff0c; 一 單片機的位數 單片機的位數是指單片機數據總線的寬度&#xff0c;也就是一次能處理的數據的位數&a…

推薦幾個常用免費的文本轉語音工具

推薦幾個常用免費的文本轉語音工具 在數字內容創作的時代&#xff0c;文本轉語音(TTS)技術已經成為內容創作者的得力助手。無論是制作視頻配音、有聲讀物、還是為網站增加語音功能&#xff0c;這些工具都能大幅提高創作效率。今天&#xff0c;我將為大家推薦幾款優質的免費文本…

Microsoft Azure DevOps針對Angular項目創建build版本的yaml

Azure DevOps針對Angular項目創建build版本的yaml&#xff0c;并通過變量控制相應job的執行與否。 注意事項&#xff1a;代碼前面的空格是通過Tab控制的而不是通過Space控制的。 yaml文件中包含一下內容&#xff1a; 1. 自動觸發build 通過指定code branch使提交到此代碼庫的…

Python Day23 學習

繼續SHAP圖繪制的學習 1. SHAP特征重要性條形圖 特征重要性條形圖&#xff08;Feature Importance Bar Plot&#xff09;是 SHAP 提供的一種全局解釋工具&#xff0c;用于展示模型中各個特征對預測結果的重要性。以下是詳細解釋&#xff1a; 圖的含義 - 橫軸&#xff1a;表示…

.NET 8 + Angular WebSocket 高并發性能優化

.NET 8 Angular WebSocket 高并發性能優化。 .NET 8 WebSocket 高并發性能優化 WebSocket 是一種全雙工通信協議&#xff0c;允許客戶端和服務端之間保持持久連接。在高并發場景下&#xff0c;優化 WebSocket 的性能至關重要。以下是針對 .NET 8 中 WebSocket 高并發性能優化…

Ubuntu 22.04.5 LTS 基于 kubesphere 安裝 cube studio

Ubuntu 22.04.5 LTS 基于 kubesphere 安裝 cube studio 前置條件 已經成功安裝 kubesphere v4.3.1 參考教程: https://github.com/data-infra/cube-studio/wiki/%E5%9C%A8-kubesphere-%E4%B8%8A%E6%90%AD%E5%BB%BA-cube-studio 1. 安裝基礎依賴 # ubuntu安裝基礎依賴 apt insta…

centos 7 安裝 java 運行環境

centos 7 安裝 java 運行環境 java -version java version "1.8.0_131" Java(TM) SE Runtime Environment (build 1.8.0_131-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)java -version java version "1.8.0_144" Java(TM) …

Linux系統管理與編程20:Apache

蘭生幽谷&#xff0c;不為莫服而不芳&#xff1b; 君子行義&#xff0c;不為莫知而止休。 做好網絡和yum配置&#xff0c;用前面dns規劃的www的IP進行。 #!/bin/bash #----------------------------------------------------------- # File Name: myWeb.sh # Version: 1.0 # …

.NET 在鴻蒙系統上的適配現狀

目錄 .NET 在鴻蒙系統上的適配現狀 鴻蒙系統對虛擬機的限制與.NET的適配挑戰 NativeAOT 在鴻蒙系統中的適配原理與實現方式 已知問題與解決方案&#xff1a;鴻蒙系統中的 syscall 限制 鴻蒙系統適配中的技術難點與解決方案 跨平臺編譯的挑戰與應對策略 依賴庫管理與兼容…

kotlin JvmName注解的作用和用途

1. JvmName 注解的作用 JvmName 是 Kotlin 提供的一個注解&#xff0c;用于在編譯為 Java 字節碼時自定義生成的類名或方法名。 作用對象&#xff1a; 文件級別&#xff08;整個 .kt 文件&#xff09;函數、屬性、類等成員 主要用途&#xff1a; 控制 Kotlin 編譯后生成的 JV…

樹莓派4 yolo 11l.pt性能優化后的版本

樹莓派4 使用 Picamera2 拍攝圖像&#xff0c;然后通過 YOLO11l.pt 進行目標檢測&#xff0c;并在實時視頻流中顯示結果。但當前的代碼在運行時可能會比較卡頓&#xff0c;主要原因包括&#xff1a; picam2.capture_array() 是一個較慢的操作&#xff1b;YOLO 推理可能耗時較長…

Docker私有倉庫實戰:官方registry鏡像實戰應用

抱歉抱歉&#xff0c;離職后反而更忙了&#xff0c;拖了好久&#xff0c;從4月拖到現在&#xff0c;在學習企業級方案Harbor之前&#xff0c;我們先學習下官方方案registry&#xff0c;話不多說&#xff0c;詳情見下文。 注意&#xff1a;下文省略了基本認證 TLS加密&#xff…