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

MySQL 查詢效能優化全攻略:快取、索引、排序與進階技巧

     編輯:MySQL 資料庫相關知識

MySQL 查詢效能優化六大核心策略

查詢是資料庫最常用的操作,雖然流程簡單(客戶端送 SQL → 伺服器執行 → 回傳結果),但不同寫法與設定對效能影響巨大。本文深入探討六大優化方向。

一、善用查詢快取提升速度

MySQL 4.0.1+ 內建查詢快取。啟用方式:在 my.ini 設定 query_cache_type=1。啟用後,相同的 SELECT 會直接從快取回傳結果。

注意事項:

  • 快取區分大小寫:SELECT * FROM t 與 select * from t 視為不同查詢
  • 不自動處理前後空格,撰寫 SQL 時應避免多餘空格
  • 需即時資料或極少執行的查詢,可用 SQL_NO_CACHE 強制略過快取:
    SELECT SQL_NO_CACHE col1, col2 FROM t;
  • 設定 query_cache_type=2(DEMAND 模式),僅對加上 SQL_CACHE 的查詢啟用快取

二、MySQL 自動優化:索引不總是最快

當 WHERE 條件符合的資料佔全表比例過高(約 30% 以上),MySQL 會自動放棄索引改用全表掃描,因為索引排序成本過高。此閾值因儲存引擎而異。

-- 範例:若 ID=1000 的資料佔 50%,使用 SALE_DATE 索引反而變慢
SELECT AVG(price) FROM sales
WHERE id = 1000 AND sale_date BETWEEN '2004-01-01' AND '2005-12-31';

三、複合索引解決排序效能瓶頸

MySQL 查詢最多只能用一個索引。若 WHERE 已用掉索引,ORDER BY 就無法用索引排序。

-- 原本:WHERE 用 name 索引,ORDER BY sale_date 無索引
SELECT * FROM sales WHERE name = 'xxx' ORDER BY sale_date DESC;

-- 解法:建立複合索引 (name, sale_date)
ALTER TABLE sales DROP INDEX name, ADD INDEX (name, sale_date);

限制: WHERE 子句不可包含排序欄位(如 sale_date),否則查詢又會變慢。

四、不可達查詢自動偵測

條件恆為假的查詢(如 value < 100 AND value > 200 或 name='a' AND name='b'),MySQL 會在執行前分析並直接略過,不掃描資料表。可用 EXPLAIN 驗證:table 欄位為空即表示未實際存取。

五、查詢選項微調效能

選項用途範例
STRAIGHT_JOIN強制連接順序SELECT ... FROM t1 STRAIGHT_JOIN t2 WHERE ...
USE INDEX限制只考慮指定索引SELECT * FROM t USE INDEX (col1, col2) ...
IGNORE INDEX排除特定索引SELECT * FROM t IGNORE INDEX (col1) ...
FORCE INDEX強制使用某索引SELECT * FROM t FORCE INDEX (col1) ...
SQL_BUFFER_RESULT結果存入暫存表,快速釋放表鎖SELECT SQL_BUFFER_RESULT * FROM t ...
SQL_BIG_RESULT分組/去重時建議用暫存表排序SELECT SQL_BIG_RESULT col1, COUNT(*) FROM t GROUP BY col1

六、結語

資料庫優化遵循「二八原則」:20% 的 SQL 消耗 80% 的時間。核心在於減少磁碟 I/O、善用循序讀取。持續分析慢查詢、調整索引、善用快取,才能穩定提升效能。

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