昨天晚上幫人「測試」網站,發現速度卡在 MySQL 的 CPU bound,先用 httperf 丟在背景跑,再用 mytop 抓幾個比較明顯的 slow query,補了幾刀 INDEX 後,速度快了不少,不過還是不太滿意。
印象中 MySQL 除了可以紀錄 slow query 外,還可以紀錄沒用到 INDEX 的 SQL query,花了不少時間才找到。這些指令是可以線上改,不需要重開 (如果你堅持要改設定檔重開也 ok),不過請不要在 production 的機器上開,以免 SQL query 寫的很爛,產生大量的 log:
mysql> SET GLOBAL log_queries_not_using_indexes = 1;
Query OK, 0 rows affected (0.00 sec)
mysql> SET GLOBAL slow_query_log = 1;
Query OK, 0 rows affected (0.00 sec)
PS:這只是告訴你問題在哪裡,而非解決的方法。要知道為什麼會慢,你需要讀不少資料,像是 High Performance MySQL 這類的書籍,以及網路上 MySQL 資料庫長輩們的討論。
Update:翻到 Arjen's Journal - Finding useless indexes 這篇,可以檢查過度 index 時造成效能降低的問題 :p
MySQL 5.1 现在适合做production了么?