程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> Monty說MySQL的優化(三)

Monty說MySQL的優化(三)

編輯:MySQL綜合教程

本文是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)))
對每個表使用最有效的表格式。
在不同表中保存相同信息的列應該有同樣的定義並具有相同的列名。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved