LAMP系統(tǒng)MySQL數(shù)據(jù)庫(kù)服務(wù)器優(yōu)化技巧:對(duì)查詢進(jìn)行優(yōu)化
LAMP系統(tǒng)MySQL數(shù)據(jù)庫(kù)服務(wù)器優(yōu)化技巧:對(duì)查詢進(jìn)行優(yōu)化
每個(gè)會(huì)話的設(shè)置
下面這些設(shè)置針對(duì)于每個(gè)會(huì)話。在設(shè)置這些數(shù)字時(shí)要十分謹(jǐn)慎,因?yàn)樗鼈冊(cè)诔艘钥赡艽嬖诘倪B接數(shù)時(shí)候,這些選項(xiàng)表示大量的內(nèi)存!您可以通過(guò)代碼修改會(huì)話中的這些數(shù)字,或者在 my.cnf 中為所有會(huì)話修改這些設(shè)置。
當(dāng) MySQL 必須要進(jìn)行排序時(shí),就會(huì)在從磁盤(pán)上讀取數(shù)據(jù)時(shí)分配一個(gè)排序緩沖區(qū)來(lái)存放這些數(shù)據(jù)行。如果要排序的數(shù)據(jù)太大,那么數(shù)據(jù)就必須保存到磁盤(pán)上的臨時(shí)文件中,并再次進(jìn)行排序。如果 sort_merge_passes 狀態(tài)變量很大,這就指示了磁盤(pán)的活動(dòng)情況。清單 8 給出了一些與排序相關(guān)的狀態(tài)計(jì)數(shù)器信息。
清單 8. 顯示排序統(tǒng)計(jì)信息
- 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 將排序緩沖區(qū)設(shè)置為 4MB。
MySQL 也會(huì)分配一些內(nèi)存來(lái)讀取表。理想情況下,索引提供了足夠多的信息,可以只讀入所需要的行,但是有時(shí)候查詢(設(shè)計(jì)不佳或數(shù)據(jù)本性使然)需要讀取表中大量數(shù)據(jù)。要理解這種行為,需要知道運(yùn)行了多少個(gè) SELECT 語(yǔ)句,以及需要讀取表中的下一行數(shù)據(jù)的次數(shù)(而不是通過(guò)索引直接訪問(wèn))。實(shí)現(xiàn)這種功能的命令如清單 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。如果該值超過(guò) 4000,就應(yīng)該查看 read_buffer_size,例如 read_buffer_size = 4M。如果這個(gè)數(shù)字超過(guò)了 8M,就應(yīng)該與開(kāi)發(fā)人員討論一下對(duì)這些查詢進(jìn)行調(diào)優(yōu)了!
【編輯推薦】