首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 建表與索引規範 18 條鐵律:從命名到優化的完整指南

     編輯:MySQL 資料庫相關知識

規範的建表與索引設計,是高性能、可維護數據庫的基石。本文匯總 18 條核心規範,涵蓋字段定義、索引策略、命名規範、優化驗證全生命週期。

一、建表字段規範(1-4)

  1. 非空約束 + 默認值:所有字段定義為 NOT NULL,並顯式指定 DEFAULT 值
  2. 業務必填字段:NOT NULL 無默認值,應用層保證傳值
  3. 外鍵關聯字段必建索引:FOREIGN KEY 列或業務邏輯關聯列,必須建立索引
  4. 跨表同義字段類型完全一致:類型、長度、非空、默認值全維度一致,否則關聯查詢無法使用索引

二、索引使用鐵律(5-14)

  1. 單查單索引:一條 SQL 只能使用一個表的一個索引(Index Merge 除外,不建議依賴)
  2. 最優索引選擇:優化器傾向選擇過濾性最強(區分度最高、返回行數最少)的索引
  3. 聯合索引 = 多個前綴索引:INDEX(a,b,c) 等價於 INDEX(a)、INDEX(a,b)、INDEX(a,b,c) 三個索引
  4. LIKE 索引生效條件:LIKE 'prefix%' 走索引,LIKE '%suffix' / LIKE '%mid%' 全表掃描
  5. COUNT(*) vs COUNT(col):無 WHERE 時 COUNT(*) 較慢(掃描聚簇索引),有 WHERE 時 COUNT(*) 更快
  6. AND 條件需同一聯合索引:多個 AND 條件列必須屬於同一聯合索引,且包含最左列
  7. OR 條件每列皆需索引:WHERE a=1 OR b=2 中 a、b 都必須有索引,否則全表掃描
  8. ORDER BY 列需同一索引且序一致:ORDER BY a ASC, b DESC 需 INDEX(a ASC, b DESC)(MySQL 8.0+ 支持降序索引)
  9. GROUP BY 列需同一索引且有序:所有 GROUP BY 列來自同一索引,且索引按順序存儲鍵值
  10. JOIN 關聯列雙邊建索引:ON/WHERE 涉及的關聯列,驅動表與被驅動表都需建立合適索引

三、優化干預與維護(15-18)

  1. FORCE INDEX 干預:全表掃描場景經驗證索引更優時,使用 FORCE INDEX(idx_name) 強制
  2. 定期 ANALYZE TABLE:更新索引統計信息,修正優化器誤判
  3. 慢查詢 + EXPLAIN 閉環:開啟慢查詢日志,定期分析 Top SQL 執行計劃
  4. 關鍵緩衝區參數:
    • key_buffer_size(全局,MyISAM 索引緩衝)
    • query_cache_size(全局,謹慎啟用)
    • sort_buffer_size(會話級,建議 ≤4MB)

四、命名規範

對象前綴格式示例
主鍵pk_pk_表名pk_user
外鍵fk_fk_子表_父表fk_order_user
唯一索引uni_uni_表名_列名uni_user_email
普通索引ind_ind_表名_列名ind_user_status
  • 全小寫、下劃線分隔、長度 ≤30 字符
  • 過長時按表名縮寫規則縮寫

五、EXPLAIN 實戰解讀速查表

type 值(優→劣)含義
system / const常量表/主鍵唯一查找,極快
eq_ref唯一索引/主鍵聯表查找
ref非唯一索引查找
range索引範圍掃描(>、<、BETWEEN、LIKE 'prefix%')
index全索引掃描
ALL全表掃描(需優化)
Extra 危險信號含義
Using filesort需額外排序,無索引支持 ORDER BY
Using temporary創建臨時表,通常 GROUP BY/ORDER BY 列不一致
Range checked for each record無理想索引,逐行檢查可用索引(極慢)

六、經典 FAQ:為什麼有索引卻不走?

-- 表 10萬行,created_at 有索引
SELECT * FROM t WHERE created_at < '2010-01-20';  -- 命中 6萬行
EXPLAIN: type=ALL, key=NULL

-- 改為範圍查詢
SELECT * FROM t WHERE created_at BETWEEN '2009-12-06' AND '2010-01-20';  -- 命中幾百行
EXPLAIN: type=range, key=created_at

核心準則:索引目的是縮小結果集。當預估掃描行數超過表總行數 20-30%,優化器判定全表掃描更優,放棄索引。類似 gender 這類低區分度列建索引無意義。

落地 18 條鐵律,建立 Code Review 機制,讓規範成為團隊肌肉記憶。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved