在一個 SQL 服務器中,數據表都是保存在磁盤上的。索引為服務器提供了一種在表中查找特定數據行的方法,而不用搜索整個表。當必須要搜索整個表時,就稱為表掃描。通常來說,您可能只希望獲得表中數據的一個子集,因此全表掃描會浪費大量的磁盤 I/O,因此也就會浪費大量時間。當必須對數據進行連接時,這個問題就更加復雜了,因為必須要對連接兩端的多行數據進行比較。
當然,表掃描並不總是會帶來問題;有時讀取整個表反而會比從中挑選出一部分數據更加有效(服務器進程中查詢規劃器用來作出這些決定)。如果索引的使用效率很低,或者根本就不能使用索引,則會減慢查詢速度,而且隨著服務器上的負載和表大小的增加,這個問題會變得更加顯著。執行時間超過給定時間范圍的查詢就稱為慢速查詢。
您可以配置 MySQLd 將這些慢速查詢記錄到適當命名的慢速查詢日志中。管理員然後會查看這個日志來幫助他們確定應用程序中有哪些部分需要進一步調查。在my.cnf中修改配置:[MySQLd]
; enable the slow query log, default 10 seconds
log-slow-querIEs
; log querIEs taking longer than 5 seconds
long_query_time = 5
; log querIEs that don't use indexes even if they take less than long_query_time
; MySQL 4.1 and newer only
log-querIEs-not-using-indexes
這三個設置一起使用,可以記錄執行時間超過 5 秒和沒有使用索引的查詢。請注意有關 log-querIEs-not-using-indexes 的警告:您必須使用 MySQL 4.1 或更高版本。慢速查詢日志都保存在 MySQL 數據目錄中,名為 hostname-slow.log。如果希望使用一個不同的名字或路徑,可以在 my.cnf 中使用 log-slow-querIEs = /new/path/to/file 實現此目的。
閱讀慢速查詢日志最好是通過 mysqldumpslow 命令進行。指定日志文件的路徑,就可以看到一個慢速查詢的排序後的列表,並且還顯示了它們在日志文件中出現的次數。一個非常有用的特性是 MySQLdumpslow 在比較結果之前,會刪除任何用戶指定的數據,因此對同一個查詢的不同調用被計為一次;這可以幫助找出需要工作量最多的查詢。