本文是Monty在O'Reilly Open Source Convention 2000大會上的演講之三,涉及維護、優化SQL 、不同SQL服務器的速度差別、重要的MySQL啟動選項、優化表五個方面,是篇詳盡的MySQL優化文檔
十一、維護
如果可能,偶爾運行一下OPTIMIZE table,這對大量更新的變長行非常重要。
偶爾用myisamchk -a更新一下表中的鍵碼分布統計。記住在做之前關掉MySQL。
如果有碎片文件,可能值得將所有文件復制到另一個磁盤上,清除原來的磁盤並拷回文件。
如果遇到問題,用myisamchk或CHECK table檢查表。
用mysqladmin -i10 precesslist extended-status監控MySQL的狀態。
用MySQL GUI客戶程序,你可以在不同的窗口內監控進程列表和狀態。
使用mysqladmin debug獲得有關鎖定和性能的信息。
十二、優化SQL
揚SQL之長,其它事情交由應用去做。使用SQL服務器來做:
找出基於WHERE子句的行。
JOIN表
GROUP BY
ORDER BY
DISTINCT
不要使用SQL來做:
檢驗數據(如日期)
成為一只計算器
技巧:
明智地使用鍵碼。
鍵碼適合搜索,但不適合索引列的插入/更新。
保持數據為數據庫第三范式,但不要擔心冗余信息或這如果你需要更快的速度,創建總結表。
在大表上不做GROUP BY,相反創建大表的總結表並查詢它。
UPDATE table set count=count+1 where key_column=constant非常快。
對於大表,或許最好偶爾生成總結表而不是一直保持總結表。
充分利用INSERT的默認值。
十三、不同SQL服務器的速度差別(以秒計)
通過鍵碼讀取2000000行: NT Linux
mysql 367 249
mysql_odbc 464
db2_odbc 1206
informix_odbc 121126
ms-sql_odbc 1634
oracle_odbc 20800
solid_odbc 877
sybase_odbc 17614
插入350768行: NT Linux
mysql 381 206
mysql_odbc 619
db2_odbc 3460
informix_odbc 2692
ms-sql_odbc 4012
oracle_odbc 11291
solid_odbc 1801
sybase_odbc 4802
在上述測試中,MySQL配置8M高速緩存運行,其他數據庫以默認安裝運行。
十四、重要的MySQL啟動選項
back_log 如果需要大量新連接,修改它。
thread_cache_size 如果需要大量新連接,修改它。
key_buffer_size 索引頁池,可以設成很大。
bdb_cache_size BDB表使用的記錄和鍵嗎高速緩存。
table_cache 如果有很多的表和並發連接,修改它。
delay_key_write 如果需要緩存所有鍵碼寫入,設置它。
log_slow_queries 找出需花大量時間的查詢。
max_heap_table_size 用於GROUP BY
sort_buffer 用於ORDER BY和GROUP BY
myisam_sort_buffer_size 用於REPAIR TABLE
join_buffer_size 在進行無鍵嗎的聯結時使用。
十五、優化表
MySQL擁有一套豐富的類型。你應該對每一列嘗試使用最有效的類型。
ANALYSE過程可以幫助你找到表的最優類型:SELECT * FROM table_name PROCEDURE ANALYSE()。
對於不保存NULL值的列使用NOT NULL,這對你想索引的列尤其重要。
將ISAM類型的表改為MyISAM。
如果可能,用固定的表格式創建表。
不要索引你不想用的東西。
利用MySQL能按一個索引的前綴進行查詢的事實。如果你有索引INDEX(a,b),你不需要在a上的索引。
不在長CHAR/VARCHAR列上創建索引,而只索引列的一個前綴以節省存儲空間。CREATE TABLE table_name (hostname CHAR(255) not null, index(hostname(10)))
對每個表使用最有效的表格式。
在不同表中保存相同信息的列應該有同樣的定義並具有相同的列名。