首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 性能優化 20+ 黃金經驗總結:查詢緩存、EXPLAIN、索引設計、架構優化與陷阱避坑

     編輯:MySQL 綜合教學

MySQL 性能優化 20+ 黃金經驗總結

1. 為查詢緩存優化查詢

避免使用 NOW()、RAND()、CURDATE() 等非確定性函數,改用應用層變數:

-- 不走緩存
SELECT * FROM user WHERE signup_date >= CURDATE();

-- 走緩存
$today = date('Y-m-d');
SELECT * FROM user WHERE signup_date >= '$today';

2. 善用 EXPLAIN 分析執行計劃

關注 rows (預估掃描行)、key (實際用索引)、Extra (Using index/where/temporary/filesort)。

3. 單行查詢加 LIMIT 1

-- 低效
SELECT * FROM user WHERE country='China';
-- 高效
SELECT 1 FROM user WHERE country='China' LIMIT 1;

4. 為搜尋欄位建索引

LIKE 'prefix%'` 可用索引,`LIKE '%suffix'` 無法用索引 (需全文索引)。

5. JOIN 欄位類型、字符集、索引三一致

-- 錯誤:DECIMAL JOIN INT、utf8 JOIN latin1
-- 正確:同類型、同字符集、雙方都有索引

6. 絕對禁止 ORDER BY RAND()

-- 災難寫法
SELECT * FROM user ORDER BY RAND() LIMIT 1;

-- 正確:應用層隨機 ID
$count = SELECT COUNT(*) FROM user;
$rand = mt_rand(0, $count-1);
SELECT * FROM user LIMIT $rand, 1;

7. 避免 SELECT *

只取需要欄位:減少 I/O、記憶體、CPU、網傳,利用索引覆蓋。

8. 每表必設 INT UNSIGNED AUTO_INCREMENT 主鍵

業務主鍵 (如 email) 設唯一索引,不做主鍵。關聯表除外 (複合主鍵 = 外鍵組合)。

9. 固定值集合用 ENUM 代替 VARCHAR

儲存為 TINYINT,效能接近數值型。PROCEDURE ANALYSE() 會建議轉換。

10. 參考 PROCEDURE ANALYSE() 建議優化結構

phpMyAdmin「Propose table structure」功能即基於此。

11. 能用 NOT NULL 就不用 NULL

NULL 需額外位元組標記,MyISAM 每欄位 1 bit 對齊到 byte。比較邏輯更複雜。

12. 使用 Prepared Statements

  • 防 SQL 注入 (參數綁定)
  • 重複執行只解析一次
  • 二進制協定傳輸效率高
  • 注意:5.1 前不支援查詢緩存

13. 無緩衝查詢 (大結果集)

mysql_unbuffered_query()  -- PHP
-- 記憶體省、首行即可處理、但需讀完或 free_result 才能下一查詢

14. IP 存為 UNSIGNED INT

INET_ATON('192.168.1.1') → 3232235777 (插入)
INET_NTOA(3232235777) → '192.168.1.1' (查詢)
PHP: ip2long() / long2ip() (注意有號無號轉換)

15. 固定長度表更快 (無 VARCHAR/TEXT/BLOB)

偏移量計算 O(1),快取重建快。垂直分割將變長欄位移出主表。

16. 垂直分割 (大表拆分)

  • 低頻/大欄位 (address, bio) 移至副表
  • 高頻更新欄位 (last_login) 移出避免清查詢緩存
  • 慎用 JOIN 重組,否則效能指數級下降

17. 大批次 DELETE/INSERT 分批 + 休眠

while (1) {
    DELETE FROM logs WHERE log_date <= '2012-01-01' LIMIT 1000;
    if (mysql_affected_rows() == 0) break;
    usleep(50000);  -- 50ms 讓出鎖
}

18. 越小的型別越快

TINYINT < SMALLINT < MEDIUMINT < INT < BIGINT,DATE < DATETIME。預留擴展空間避免 ALTER TABLE 鎖表數小時。

19. 選對儲存引擎

引擎優點缺點適用
MyISAM讀快、COUNT(*) 極快、全文索引表鎖、無事務、崩潰易損壞讀多寫少、日誌/報表
InnoDB行鎖、事務、外鍵、崩潰恢復寫入較慢、空間較大高併發寫入、金融/核心業務

20. 使用 ORM (Object Relational Mapper)

Lazy Loading、批次 SQL 打包事務、Doctrine 推薦。警惕 N+1 查詢問題。

21. 謹慎使用持久連線 (pconnect)

Apache 多進程模型下易耗盡連線數、記憶體、檔案控制代碼。現代架構建議短連線 + 連線池。

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