建立 110 萬筆測試資料 (102 MB),在 phpMyAdmin 執行 5 類查詢並測量耗時,對比**有無索引**、**LIKE 前綴/後綴**、**函數查詢**對效能的真實影響,數據直觀揭示索引價值與查寫陷阱。
id (PK), col1 (VARCHAR), col2 (TEXT), col3 (DATETIME)| 查詢類型 | 有索引 | 無索引 | 倍數差異 |
|---|---|---|---|
| A. 字元欄位精確比對 | 0.0005 | 0.3439 | **688x** |
| B. 主鍵精確查詢 | 0.0005 | 0.0004 | ~1x (PK 預設索引) |
| C. 函數查詢 (如 SUBSTRING) | 0.4482 | 0.4882 | ~1x (**索引失效**) |
| D. LIKE 'xxx%' (前綴) | 0.0007 | 0.3487 | **498x** |
| E. LIKE '%xxx%' (後綴/中間) | 0.7361 | 0.7339 | ~1x (**索引失效**) |
WHERE SUBSTRING(col,1,3)='abc' 無法使用索引,與無索引同速。WHERE col LIKE '%abc%' 需掃描全表,索引無用。WHERE col LIKE 'abc%' 可走索引範圍掃描。| 場景 | 優化策略 |
|---|---|
| 精確比對 / 前綴 LIKE | **建立 B-Tree 索引** (單欄或複合) |
| 函數查詢 | 改寫為範圍查詢:WHERE col >= 'abc' AND col < 'abd';或建立**函數索引** (MySQL 8.0+ 支援) |
| 全文/模糊搜尋 | 使用**全文索引** (MATCH...AGAINST) 或 **ngram 解析器** (5.7+) |
| 後綴 LIKE 必須支援 | 反轉欄位儲存 (REVERSE) + 前綴 LIKE;或外部搜尋引擎 (Elasticsearch) |
TEXT 欄位建立索引曾導致系統近乎卡死,**大型文字欄位慎用索引**,改用全文索引或外部引擎。**「索引是讀取加速器,也是寫入負擔」**。針對高頻精確查詢、前綴 LIKE 建立索引;避免函數包裝索引欄位、後綴 LIKE;大型文字改用全文索引。以實測數據驅動索引設計,才能在讀寫平衡點上最大化效能。