不熟悉業務的設計人員,縱使資料庫技術深厚,也難設計出高效能系統。業務知識是效能調優的基石。
BLOB 而非 CHAR(1024),BLOB 僅存指標,實體內容可外置,減少資料庫體積提升速度UDT (User Defined Datatypes) 定義業務語義類型| 建立索引場景 | 說明 |
|---|---|
| 頻繁 JOIN 但非外鍵的欄位 | 加速關聯查詢 |
| 頻繁 GROUP BY / ORDER BY 的欄位 | 利用索引有序特性避免排序 |
| WHERE 條件常用且基數高的欄位 | 高選擇性索引效果最佳 |
| 多欄位排序/分組 | 建立複合索引 |
代價:索引降低 INSERT/UPDATE/DELETE 效能,佔用額外磁碟空間與維護成本。
整數型主鍵效能遠優於字串型。字串比較開銷大幅高於整數,資料量大時微小差異放大為顯著效能落差。
-- 子查詢:效能差,每個外層值掃描一次內層表
SELECT CreateUser FROM Order WHERE OrderNo IN (SELECT OrderNo FROM OrderDetail WHERE Price=0.5)
-- JOIN 改寫:掃描比例優化
SELECT CreateUser FROM Order, OrderDetail WHERE Order.OrderNo=OrderDetail.OrderNo AND Price=0.5
原則:盡量避免子查詢,不可避免時在子查詢中過濾更多資料列。
-- 低效:LIKE 'M___' 即使有索引仍全表掃描
-- 高效:利用索引範圍查詢
SELECT * FROM Order WHERE CreateUser > 'M' AND CreateUser < 'N'
DISTINCT 產生工作表並排序,大幅增加 I/O!=、<>、NOT IN 導致全表掃描Query Patroller 比較不同計劃代價,Performance Monitor 監控整體效能指標