設計索引的原則有哪些?

MySQL 索引設計的核心原則是 在查詢性能與存儲成本之間取得平衡。以下是經過實踐驗證的 10 大設計原則及具體實現策略:


一、基礎原則

原則說明示例/反例
1. 高頻查詢優先WHEREJOINORDER BYGROUP BY 頻繁出現的列建索引? SELECT * FROM orders WHERE user_id=100 → 為 user_id 建索引
2. 高區分度優先選擇區分度高的列(唯一值比例 ≈1)? 身份證號 > 性別
? 在 gender(僅2種值)建索引效果差
3. 最左前綴匹配聯合索引按查詢順序從左到右排列索引 (a,b,c) 生效場景:
? WHERE a=1
? WHERE a=1 AND b=2
? WHERE b=2

二、字段選擇原則

原則說明最佳實踐
4. 短字段優先更小的索引 → 更高緩存命中率SMALLINT 代替 INT
CHAR(10) 代替 VARCHAR(100)
5. 整型優于字符型整型比較比字符串快,且節省空間IP 轉 INT (INET_ATON()) 代替字符串存儲 IP
6. 避免 NULL 列NULL 增加索引復雜度建表時設置 NOT NULL DEFAULT ''

三、索引類型選擇

場景推薦索引類型優勢
7. 精確匹配B+Tree 索引標準場景,支持 =, >, <, BETWEEN
8. 全文搜索FULLTEXT 索引TEXT 內容高效搜索 (MATCH AGAINST)
9. 空間數據SPATIAL 索引地理位置計算 (GIS)
10. 哈希去重唯一索引 (UNIQUE)強制業務唯一性(如用戶名)

四、聯合索引設計策略

1. 列順序決策公式
優先級 = 查詢頻率 × 區分度
  • 正確示例
    orders 的查詢模式:
    SELECT * FROM orders 
    WHERE status='paid'          -- 區分度低 (3種狀態)AND create_time > '2023-01-01' -- 區分度高
    
    → 聯合索引應設為 (create_time, status)
2. 覆蓋索引優化
-- 未優化
SELECT name, email FROM users WHERE age>30; -- 優化方案:創建覆蓋索引
ALTER TABLE users ADD INDEX idx_age_name_email (age, name, email);
  • ? 效果:索引覆蓋所有查詢字段,避免回表

五、避坑指南(常見錯誤)

錯誤做法問題改進方案
盲目創建索引寫性能下降 30%~50%用慢查詢日志定位真正需要的索引
無效索引WHERE status=1 (status=1 占比 95%)刪除低區分度索引
冗余索引已有 (a,b) 又建 (a)刪除單列索引 (a)
索引列參與運算WHERE YEAR(create_time)=2023改范圍查詢:WHERE create_time BETWEEN '2023-01-01' AND '2023-12-31'

六、高級優化技巧

1. 索引下推 (ICP)
  • 啟用條件:MySQL 5.6+,聯合索引部分條件過濾
  • 效果
    -- 索引 (city, age)
    SELECT * FROM users 
    WHERE city='杭州' AND age>20;-- 5.6 前:先取所有 city='杭州' 數據 → 回表 → 過濾 age>20
    -- 5.6+:在索引層直接過濾 age>20 → 僅回表匹配行
    
2. 索引合并優化
-- 存在索引 (a) 和 (b)
SELECT * FROM table WHERE a=1 OR b=2;-- 優化器可能合并索引掃描 (Index Merge)

七、索引監控與維護

1. 分析索引使用率
-- 查看未使用索引
SELECT * FROM sys.schema_unused_indexes;-- 索引統計信息
SHOW INDEX FROM orders;
2. 碎片整理
-- InnoDB 索引重建
ALTER TABLE orders ENGINE=InnoDB; -- 優化索引頁
OPTIMIZE TABLE orders;

八、設計流程圖

在這里插入圖片描述

九、總結:黃金準則

  1. 必要性原則:只為必要的查詢建索引
  2. 左前綴原則:聯合索引嚴格按查詢順序設計
  3. 覆蓋索引優先:避免 SELECT * 回表開銷
  4. 短小精悍:整型優于字符串,小字段優于大字段
  5. 持續監控:定期清理無效索引(寫代價 > 讀收益)

📊 數據佐證:根據阿里云數據庫團隊統計,合理索引設計可使查詢性能提升 10~100 倍,降低 70% 的數據庫負載。

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

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

相關文章

使用影刀RPA實現快遞信息抓取

最近公司項目有個需求&#xff0c;要求抓取快遞單號快遞信息&#xff0c;比如簽收地點、簽收日期等。該項目對應的快遞查詢網站是一個國外的網站&#xff0c;他們有專門的快遞平臺可以用于查詢。該平臺提供了快遞接口進行查詢&#xff0c;但需要付費。同時也提供了免費的查詢窗…

蟻劍--安裝、使用

用途限制聲明&#xff0c;本文僅用于網絡安全技術研究、教育與知識分享。文中涉及的滲透測試方法與工具&#xff0c;嚴禁用于未經授權的網絡攻擊、數據竊取或任何違法活動。任何因不當使用本文內容導致的法律后果&#xff0c;作者及發布平臺不承擔任何責任。滲透測試涉及復雜技…

Varjo XR虛擬現實軍用車輛駕駛與操作培訓

Patria基于混合現實的模擬器提供了根據現代車輛乘員需求定制的培訓&#xff0c;與傳統顯示設置相比&#xff0c;全新的模擬解決方案具有更好的沉浸感和更小的物理空間需求。Patria是芬蘭領先的國防、安全和航空解決方案提供商。提供尖端技術和全面的培訓系統&#xff0c;以支持…

Java 10 新特性及具體應用

目錄 1. 局部變量類型推斷&#xff08;JEP 286&#xff09; 2. 不可修改集合&#xff08;JEP 269&#xff09; 3. 并行全垃圾回收&#xff08;JEP 307&#xff09; 4. 應用類數據共享&#xff08;JEP 310&#xff09; 5. 線程局部管控&#xff08;JEP 312&#xff09; 總結…

【力扣 Hot100】刷題日記

D8 全排列(非回溯法) 全排列原題鏈接 在刷leetcode的時候&#xff0c;看到這道題目并沒法使用像STL的next_permutation方法&#xff0c;感嘆C便利的同時&#xff0c;又惋惜Java并沒有類似的API&#xff0c;那我們只能從原理入手了&#xff0c;仿寫此算法。 其實回溯法更應該…

JetPack系列教程(七):Palette——讓你的APP色彩“飛”起來!

JetPack系列教程&#xff08;七&#xff09;&#xff1a;Palette——讓你的APP色彩“飛”起來&#xff01; 各位開發小伙伴們&#xff0c;還在為APP的配色發愁嗎&#xff1f;別擔心&#xff0c;今天咱們就來聊聊JetPack家族里的“色彩魔法師”——Palette&#xff01;這個神奇的…

力扣hot100 | 矩陣 | 73. 矩陣置零、54. 螺旋矩陣、48. 旋轉圖像、240. 搜索二維矩陣 II

73. 矩陣置零 力扣題目鏈接 給定一個 m x n 的矩陣&#xff0c;如果一個元素為 0 &#xff0c;則將其所在行和列的所有元素都設為 0 。請使用 原地 算法。 示例 1&#xff1a; 輸入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 輸出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]…

ARC與eARC是什么?主要用在哪?

在家庭影音設備不斷升級的今天&#xff0c;人們對音視頻體驗的要求越來越高。無論是追劇、玩游戲還是觀看電影大片&#xff0c;很多用戶不再滿足于電視自帶的揚聲器&#xff0c;而是希望借助回音壁、功放或家庭影院系統&#xff0c;獲得更加震撼的沉浸式聲音體驗。一、ARC是什么…

解鎖JavaScript性能優化:從理論到實戰

文章目錄 前言 一、常見性能瓶頸剖析 二、實戰案例與優化方案 (一)DOM 操作優化案例? (二)事件綁定優化案例? (三)循環與遞歸優化案例? (四)內存管理優化案例? 三、性能優化工具介紹 總結 前言 性能優化的重要性 在當今數字化時代,Web 應用已成為人們生活和工作…

結構化記憶、知識圖譜與動態遺忘機制在醫療AI中的應用探析(上)

往期相關內容推薦: 基于Python的多元醫療知識圖譜構建與應用研究(上)

XSS攻擊:從原理入門到實戰精通詳解

一、XSS攻擊基礎概念1.1 什么是XSS攻擊 XSS&#xff08;Cross-Site Scripting&#xff0c;跨站腳本攻擊&#xff09;是一種將惡意腳本注入到可信網站中的攻擊手段。當用戶訪問被注入惡意代碼的頁面時&#xff0c;瀏覽器會執行這些代碼&#xff0c;導致&#xff1a;用戶會話被劫…

Leetcode 14 java

今天復習一下以前做過的題目&#xff0c;感覺是忘光了。 160. 相交鏈表 給你兩個單鏈表的頭節點 headA 和 headB &#xff0c;請你找出并返回兩個單鏈表相交的起始節點。如果兩個鏈表不存在相交節點&#xff0c;返回 null 。 圖示兩個鏈表在節點 c1 開始相交&#xff1a; 題目數…

用 FreeMarker 動態構造 SQL 實現數據透視分析

在 ERP、BI 等系統中&#xff0c;數據透視分析&#xff08;Pivot Analysis&#xff09;是非常常見的需求&#xff1a;用戶希望按任意維度&#xff08;如門店、時間、商品分類等&#xff09;進行分組統計&#xff0c;同時選擇不同的指標&#xff08;如 GMV、訂單數、客單價等&am…

13.深度學習——Minst手寫數字識別

第一部分——起手式 import torch from torchvision import datasets, transforms import torch.nn as nn import torch.nn.functional as F import torch.optim as optimuse_cuda torch.cuda.is_available()if use_cuda:device torch.device("cuda") else: device…

【JAVA高級】實現word轉pdf 實現,源碼概述。深坑總結

之前的需求做好后,需求,客戶突發奇想。要將生成的word轉為pdf! 因為不想讓下載文檔的人改動文檔。 【JAVA】實現word添加標簽實現系統自動填入字段-CSDN博客 事實上這個需求難度較高,并不是直接轉換就行的 word文檔當中的很多東西都需要處理 public static byte[] gener…

數據驅動測試提升自動化效率

測試工程師老王盯著滿屏重復代碼嘆氣&#xff1a;“改個搜索條件要重寫20個腳本&#xff0c;這班加到啥時候是個頭&#xff1f;” 隔壁組的小李探過頭&#xff1a;“試試數據驅動唄&#xff0c;一套腳本吃遍所有數據&#xff0c;我們組上周測了300個組合都沒加班&#xff01;”…

模板引用(Template Refs)全解析2

三、v-for 中的模板引用 當在 v-for 中使用模板引用時,引用的 value 會自動變為一個數組,包含列表中所有元素/組件的引用(需 Vue 3.5+ 版本,舊版需手動處理且順序不保證)。 1. 基本用法(Vue 3.5+) <script setup> import { ref, useTemplateRef, onMounted } f…

【Linux系統】進程間通信:System V IPC——共享內存

前文中我們介紹了管道——匿名管道和命名管道來實現進程間通信&#xff0c;在介紹怎么進行通信時&#xff0c;我們有提到過不止管道的方式進行通信&#xff0c;還有System V IPC&#xff0c;今天這篇文章我們就來學習一下System V IPC中的共享內存1. 為何引入共享內存&#xff…

[優選算法專題二滑動窗口——最大連續1的個數 III]

題目鏈接 最大連續1的個數 III 題目描述 題目解析 問題本質 輸入&#xff1a;二進制數組nums&#xff08;只包含 0 和 1&#xff09;和整數k操作&#xff1a;最多可以將k個 0 翻轉成 1目標&#xff1a;找到翻轉后能得到的最長連續 1 的子數組長度 這個問題的核心是要找到一…

C#單元測試(xUnit + Moq + coverlet.collector)

C#單元測試 xUnit Moq coverlet.collector 1.添加庫 MlyMathLib 2.編寫庫函數內容 using System;namespace MlyMathLib {public interface IUserRepo{string GetName(int id);}public class UserService{private readonly IUserRepo _repo;public UserService(IUserRepo repo…