規範的建表與索引設計,是高性能、可維護數據庫的基石。本文匯總 18 條核心規範,涵蓋字段定義、索引策略、命名規範、優化驗證全生命週期。
NOT NULL,並顯式指定 DEFAULT 值NOT NULL 無默認值,應用層保證傳值FOREIGN KEY 列或業務邏輯關聯列,必須建立索引INDEX(a,b,c) 等價於 INDEX(a)、INDEX(a,b)、INDEX(a,b,c) 三個索引LIKE 'prefix%' 走索引,LIKE '%suffix' / LIKE '%mid%' 全表掃描COUNT(*) 較慢(掃描聚簇索引),有 WHERE 時 COUNT(*) 更快WHERE a=1 OR b=2 中 a、b 都必須有索引,否則全表掃描ORDER BY a ASC, b DESC 需 INDEX(a ASC, b DESC)(MySQL 8.0+ 支持降序索引)FORCE INDEX(idx_name) 強制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 |
| 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 | 無理想索引,逐行檢查可用索引(極慢) |
-- 表 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 機制,讓規範成為團隊肌肉記憶。