LAMP系統MySQL數據庫服務器優化技巧:對查詢進行優化
LAMP系統MySQL數據庫服務器優化技巧:對查詢進行優化
每個會話的設置
下面這些設置針對于每個會話。在設置這些數字時要十分謹慎,因為它們在乘以可能存在的連接數時候,這些選項表示大量的內存!您可以通過代碼修改會話中的這些數字,或者在 my.cnf 中為所有會話修改這些設置。
當 MySQL 必須要進行排序時,就會在從磁盤上讀取數據時分配一個排序緩沖區來存放這些數據行。如果要排序的數據太大,那么數據就必須保存到磁盤上的臨時文件中,并再次進行排序。如果 sort_merge_passes 狀態變量很大,這就指示了磁盤的活動情況。清單 8 給出了一些與排序相關的狀態計數器信息。
清單 8. 顯示排序統計信息
- mysql> SHOW STATUS LIKE "sort%";
- +-------------------+---------+
- | Variable_name | Value |
- +-------------------+---------+
- | Sort_merge_passes | 1 |
- | Sort_range | 79192 |
- | Sort_rows | 2066532 |
- | Sort_scan | 44006 |
- +-------------------+---------+
- 4 rows in set (0.00 sec)
如果 sort_merge_passes 很大,就表示需要注意 sort_buffer_size。例如, sort_buffer_size = 4M 將排序緩沖區設置為 4MB。
MySQL 也會分配一些內存來讀取表。理想情況下,索引提供了足夠多的信息,可以只讀入所需要的行,但是有時候查詢(設計不佳或數據本性使然)需要讀取表中大量數據。要理解這種行為,需要知道運行了多少個 SELECT 語句,以及需要讀取表中的下一行數據的次數(而不是通過索引直接訪問)。實現這種功能的命令如清單 9 所示。
清單 9. 確定表掃描比率
- mysql> SHOW STATUS LIKE "com_select";
- +---------------+--------+
- | Variable_name | Value |
- +---------------+--------+
- | Com_select | 318243 |
- +---------------+--------+
- 1 row in set (0.00 sec)
- mysql> SHOW STATUS LIKE "handler_read_rnd_next";
- +-----------------------+-----------+
- | Variable_name | Value |
- +-----------------------+-----------+
- | Handler_read_rnd_next | 165959471 |
- +-----------------------+-----------+
- 1 row in set (0.00 sec)
Handler_read_rnd_next / Com_select 得出了表掃描比率 —— 在本例中是 521:1。如果該值超過 4000,就應該查看 read_buffer_size,例如 read_buffer_size = 4M。如果這個數字超過了 8M,就應該與開發人員討論一下對這些查詢進行調優了!
【編輯推薦】