亚洲韩日午夜视频,欧美日韩在线精品一区二区三区,韩国超清无码一区二区三区,亚洲国产成人影院播放,久草新在线,在线看片AV色

您好,歡迎來到思海網(wǎng)絡(luò),我們將竭誠為您提供優(yōu)質(zhì)的服務(wù)! 誠征網(wǎng)絡(luò)推廣 | 網(wǎng)站備案 | 幫助中心 | 軟件下載 | 購買流程 | 付款方式 | 聯(lián)系我們 [ 會員登錄/注冊 ]
促銷推廣
客服中心
業(yè)務(wù)咨詢
有事點(diǎn)擊這里…  531199185
有事點(diǎn)擊這里…  61352289
點(diǎn)擊這里給我發(fā)消息  81721488
有事點(diǎn)擊這里…  376585780
有事點(diǎn)擊這里…  872642803
有事點(diǎn)擊這里…  459248018
有事點(diǎn)擊這里…  61352288
有事點(diǎn)擊這里…  380791050
技術(shù)支持
有事點(diǎn)擊這里…  714236853
有事點(diǎn)擊這里…  719304487
有事點(diǎn)擊這里…  1208894568
有事點(diǎn)擊這里…  61352289
在線客服
有事點(diǎn)擊這里…  531199185
有事點(diǎn)擊這里…  61352288
有事點(diǎn)擊這里…  983054746
有事點(diǎn)擊這里…  893984210
當(dāng)前位置:首頁 >> 技術(shù)文章 >> 文章瀏覽
技術(shù)文章

MySQL服務(wù)器進(jìn)行調(diào)優(yōu)

添加時間:2012-4-18  添加: admin 

關(guān)于 MySQL 調(diào)優(yōu)

  有 3 種方法可以加快 MySQL 服務(wù)器的運(yùn)行速度,效率從低到高依次為:

  替換有問題的硬件。 對 MySQL 進(jìn)程的設(shè)置進(jìn)行調(diào)優(yōu)。 對查詢進(jìn)行優(yōu)化。

  替換有問題的硬件通常是我們的第一考慮,主要原因是數(shù)據(jù)庫會占用大量資源。不過這種解決方案也就僅限于此了。實(shí)際上,您通常可以讓中央處理器(CPU)或磁盤速度加倍,也可以讓內(nèi)存增大 4 到 8 倍。

  第二種方法是對 MySQL 服務(wù)器(也稱為 mysqld)進(jìn)行調(diào)優(yōu)。對這個進(jìn)程進(jìn)行調(diào)優(yōu)意味著適當(dāng)?shù)胤峙鋬?nèi)存,并讓 mysqld 了解將會承受何種類型的負(fù)載。加快磁盤運(yùn)行速度不如減少所需的磁盤訪問次數(shù)。類似地,確保 MySQL 進(jìn)程正確操作就意味著它花費(fèi)在服務(wù)查詢上的時間要多于花費(fèi)在處理后臺任務(wù)(如處理臨時磁盤表或打開和關(guān)閉文件)上的時間。對 mysqld 進(jìn)行調(diào)優(yōu)是本文的重點(diǎn)。

  最好的方法是確保查詢已經(jīng)進(jìn)行了優(yōu)化。這意味著對表應(yīng)用了適當(dāng)?shù)乃饕樵兪前凑湛梢猿浞掷?MySQL 功能的方式來編寫的。盡管本文并沒有包含查詢調(diào)優(yōu)方面的內(nèi)容(很多著作中已經(jīng)針對這個主題進(jìn)行了探討),不過它會配置 mysqld 來報(bào)告可能需要進(jìn)行調(diào)優(yōu)的查詢。

  雖然已經(jīng)為這些任務(wù)指派了次序,但是仍然要注意硬件和 mysqld 的設(shè)置以利于適當(dāng)?shù)卣{(diào)優(yōu)查詢。機(jī)器速度慢也就罷了,我曾經(jīng)見過速度很快的機(jī)器在運(yùn)行設(shè)計(jì)良好的查詢時由于負(fù)載過重而失敗,因?yàn)?mysqld 被大量繁忙的工作所占用而不能服務(wù)查詢。

  記錄慢速查詢

  在一個 SQL 服務(wù)器中,數(shù)據(jù)表都是保存在磁盤上的。索引為服務(wù)器提供了一種在表中查找特定數(shù)據(jù)行的方法,而不用搜索整個表。當(dāng)必須要搜索整個表時,就稱為表掃描。通常來說,您可能只希望獲得表中數(shù)據(jù)的一個子集,因此全表掃描會浪費(fèi)大量的磁盤 I/O,因此也就會浪費(fèi)大量時間。當(dāng)必須對數(shù)據(jù)進(jìn)行連接時,這個問題就更加復(fù)雜了,因?yàn)楸仨氁獙B接兩端的多行數(shù)據(jù)進(jìn)行比較。

  當(dāng)然,表掃描并不總是會帶來問題;有時讀取整個表反而會比從中挑選出一部分?jǐn)?shù)據(jù)更加有效(服務(wù)器進(jìn)程中查詢規(guī)劃器用來作出這些決定)。如果索引的使用效率很低,或者根本就不能使用索引,則會減慢查詢速度,而且隨著服務(wù)器上的負(fù)載和表大小的增加,這個問題會變得更加顯著。執(zhí)行時間超過給定時間范圍的查詢就稱為慢速查詢。

  您可以配置 mysqld 將這些慢速查詢記錄到適當(dāng)命名的慢速查詢?nèi)罩局小9芾韱T然后會查看這個日志來幫助他們確定應(yīng)用程序中有哪些部分需要進(jìn)一步調(diào)查。清單 1 給出了要啟用慢速查詢?nèi)罩拘枰?my.cnf 中所做的配置。

  清單 1. 啟用 MySQL 慢速查詢?nèi)罩?/P>

  [mysqld]; enable the slow query log, default 10 secondslog-slow-queries; log queries taking longer than 5 secondslong_query_time = 5; log queries that don't use indexes even if they take less than long_query_time; MySQL 4.1 and newer onlylog-queries-not-using-indexes

  這三個設(shè)置一起使用,可以記錄執(zhí)行時間超過 5 秒和沒有使用索引的查詢。請注意有關(guān) log-queries-not-using-indexes 的警告:您必須使用 MySQL 4.1 或更高版本。慢速查詢?nèi)罩径急4嬖?MySQL 數(shù)據(jù)目錄中,名為 hostname-slow.log。如果希望使用一個不同的名字或路徑,可以在 my.cnf 中使用 log-slow-queries = /new/path/to/file 實(shí)現(xiàn)此目的。

  閱讀慢速查詢?nèi)罩咀詈檬峭ㄟ^ mysqldumpslow 命令進(jìn)行。指定日志文件的路徑,就可以看到一個慢速查詢的排序后的列表,并且還顯示了它們在日志文件中出現(xiàn)的次數(shù)。一個非常有用的特性是 mysqldumpslow 在比較結(jié)果之前,會刪除任何用戶指定的數(shù)據(jù),因此對同一個查詢的不同調(diào)用被計(jì)為一次;這可以幫助找出需要工作量最多的查詢。

  對查詢進(jìn)行緩存

  很多 LAMP 應(yīng)用程序都嚴(yán)重依賴于數(shù)據(jù)庫,但卻會反復(fù)執(zhí)行相同的查詢。每次執(zhí)行查詢時,數(shù)據(jù)庫都必須要執(zhí)行相同的工作 ?? 對查詢進(jìn)行分析,確定如何執(zhí)行查詢,從磁盤中加載信息,然后將結(jié)果返回給客戶機(jī)。MySQL 有一個特性稱為查詢緩存,它將(后面會用到的)查詢結(jié)果保存在內(nèi)存中。在很多情況下,這會極大地提高性能。不過,問題是查詢緩存在默認(rèn)情況下是禁用的。

  將 query_cache_size = 32M 添加到 /etc/my.conf 中可以啟用 32MB 的查詢緩存。

  監(jiān)視查詢緩存

  在啟用查詢緩存之后,重要的是要理解它是否得到了有效的使用。MySQL 有幾個可以查看的變量,可以用來了解緩存中的情況。清單 2 給出了緩存的狀態(tài)。

  清單 2. 顯示查詢緩存的統(tǒng)計(jì)信息

  mysql> SHOW STATUS LIKE 'qcache%';+-------------------------+------------+| Variable_name | Value |+-------------------------+------------+| Qcache_free_blocks | 5216 || Qcache_free_memory | 14640664 || Qcache_hits | 2581646882 || Qcache_inserts | 360210964 || Qcache_lowmem_prunes | 281680433 || Qcache_not_cached | 79740667 || Qcache_queries_in_cache | 16927 || Qcache_total_blocks | 47042 |+-------------------------+------------+8 rows in set (0.00 sec)

  這些項(xiàng)的解釋如表 1 所示。

  表 1. MySQL 查詢緩存變量

  變量名 說明

  Qcache_free_blocks 緩存中相鄰內(nèi)存塊的個數(shù)。數(shù)目大說明可能有碎片。FLUSH QUERY CACHE 會對緩存中的碎片進(jìn)行整理,從而得到一個空閑塊。

  Qcache_free_memory 緩存中的空閑內(nèi)存。

  Qcache_hits 每次查詢在緩存中命中時就增大。

  Qcache_inserts 每次插入一個查詢時就增大。命中次數(shù)除以插入次數(shù)就是不中比率;用 1 減去這個值就是命中率。在上面這個例子中,大約有 87% 的查詢都在緩存中命中。

  Qcache_lowmem_prunes 緩存出現(xiàn)內(nèi)存不足并且必須要進(jìn)行清理以便為更多查詢提供空間的次數(shù)。這個數(shù)字最好長時間來看;如果這個數(shù)字在不斷增長,就表示可能碎片非常嚴(yán)重,或者內(nèi)存很少。(上面的 free_blocks 和 free_memory 可以告訴您屬于哪種情況)。

  Qcache_not_cached 不適合進(jìn)行緩存的查詢的數(shù)量,通常是由于這些查詢不是 SELECT 語句。

  Qcache_queries_in_cache 當(dāng)前緩存的查詢(和響應(yīng))的數(shù)量。

  Qcache_total_blocks 緩存中塊的數(shù)量。

  通常,間隔幾秒顯示這些變量就可以看出區(qū)別,這可以幫助確定緩存是否正在有效地使用。運(yùn)行 FLUSH STATUS 可以重置一些計(jì)數(shù)器,如果服務(wù)器已經(jīng)運(yùn)行了一段時間,這會非常有幫助。

  使用非常大的查詢緩存,期望可以緩存所有東西,這種想法非常誘人。由于 mysqld 必須要對緩存進(jìn)行維護(hù),例如當(dāng)內(nèi)存變得很低時執(zhí)行剪除,因此服務(wù)器可能會在試圖管理緩存時而陷入困境。作為一條規(guī)則,如果 FLUSH QUERY CACHE 占用了很長時間,那就說明緩存太大了。

  強(qiáng)制限制

  您可以在 mysqld 中強(qiáng)制一些限制來確保系統(tǒng)負(fù)載不會導(dǎo)致資源耗盡的情況出現(xiàn)。清單 3 給出了 my.cnf 中與資源有關(guān)的一些重要設(shè)置。

  清單 3. MySQL 資源設(shè)置

  set-variable=max_connections=500set-variable=wait_timeout=10max_connect_errors = 100

  連接最大個數(shù)是在第一行中進(jìn)行管理的。與 Apache 中的 MaxClients 類似,其想法是確保只建立服務(wù)允許數(shù)目的連接。要確定服務(wù)器上目前建立過的最大連接數(shù),請執(zhí)行 SHOW STATUS LIKE 'max_used_connections'。

  第 2 行告訴 mysqld 終止所有空閑時間超過 10 秒的連接。在 LAMP 應(yīng)用程序中,連接數(shù)據(jù)庫的時間通常就是 Web 服務(wù)器處理請求所花費(fèi)的時間。有時候,如果負(fù)載過重,連接會掛起,并且會占用連接表空間。如果有多個交互用戶或使用了到數(shù)據(jù)庫的持久連接,那么將這個值設(shè)低一點(diǎn)并不可取!

  最后一行是一個安全的方法。如果一個主機(jī)在連接到服務(wù)器時有問題,并重試很多次后放棄,那么這個主機(jī)就會被鎖定,直到 FLUSH HOSTS 之后才能運(yùn)行。默認(rèn)情況下,10 次失敗就足以導(dǎo)致鎖定了。將這個值修改為 100 會給服務(wù)器足夠的時間來從問題中恢復(fù)。如果重試 100 次都無法建立連接,那么使用再高的值也不會有太多幫助,可能它根本就無法連接。

  緩沖區(qū)和緩存

  MySQL 支持超過 100 個的可調(diào)節(jié)設(shè)置;但是幸運(yùn)的是,掌握少數(shù)幾個就可以滿足大部分需要。查找這些設(shè)置的正確值可以通過 SHOW STATUS 命令查看狀態(tài)變量,從中可以確定 mysqld 的運(yùn)作情況是否符合我們的預(yù)期。給緩沖區(qū)和緩存分配的內(nèi)存不能超過系統(tǒng)中的現(xiàn)有內(nèi)存,因此調(diào)優(yōu)通常都需要進(jìn)行一些妥協(xié)。

  MySQL 可調(diào)節(jié)設(shè)置可以應(yīng)用于整個 mysqld 進(jìn)程,也可以應(yīng)用于單個客戶機(jī)會話。

  服務(wù)器端的設(shè)置

  每個表都可以表示為磁盤上的一個文件,必須先打開,后讀取。為了加快從文件中讀取數(shù)據(jù)的過程,mysqld 對這些打開文件進(jìn)行了緩存,其最大數(shù)目由 /etc/mysqld.conf 中的 table_cache 指定。清單 4 給出了顯示與打開表有關(guān)的活動的方式。

  清單 4. 顯示打開表的活動

  mysql> SHOW STATUS LIKE 'open%tables';+---------------+-------+| Variable_name | Value |+---------------+-------+| Open_tables | 5000 || Opened_tables | 195 |+---------------+-------+2 rows in set (0.00 sec)

  清單 4 說明目前有 5,000 個表是打開的,有 195 個表需要打開,因?yàn)楝F(xiàn)在緩存中已經(jīng)沒有可用文件描述符了(由于統(tǒng)計(jì)信息在前面已經(jīng)清除了,因此可能會存在 5,000 個打開表中只有 195 個打開記錄的情況)。如果 Opened_tables 隨著重新運(yùn)行 SHOW STATUS 命令快速增加,就說明緩存命中率不夠。如果 Open_tables 比 table_cache 設(shè)置小很多,就說明該值太大了(不過有空間可以增長總不是什么壞事)。例如,使用 table_cache = 5000 可以調(diào)整表的緩存。

  與表的緩存類似,對于線程來說也有一個緩存。 mysqld 在接收連接時會根據(jù)需要生成線程。在一個連接變化很快的繁忙服務(wù)器上,對線程進(jìn)行緩存便于以后使用可以加快最初的連接。

  清單 5 顯示如何確定是否緩存了足夠的線程。

  清單 5. 顯示線程使用統(tǒng)計(jì)信息

  mysql> SHOW STATUS LIKE 'threads%';+-------------------+--------+| Variable_name | Value |+-------------------+--------+| Threads_cached | 27 || Threads_connected | 15 || Threads_created | 838610 || Threads_running | 3 |+-------------------+--------+4 rows in set (0.00 sec)

  此處重要的值是 Threads_created,每次 mysqld 需要創(chuàng)建一個新線程時,這個值都會增加。如果這個數(shù)字在連續(xù)執(zhí)行 SHOW STATUS 命令時快速增加,就應(yīng)該嘗試增大線程緩存。例如,可以在 my.cnf 中使用 thread_cache = 40 來實(shí)現(xiàn)此目的。

  關(guān)鍵字緩沖區(qū)保存了 MyISAM 表的索引塊。理想情況下,對于這些塊的請求應(yīng)該來自于內(nèi)存,而不是來自于磁盤。清單 6 顯示了如何確定有多少塊是從磁盤中讀取的,以及有多少塊是從內(nèi)存中讀取的。

  清單 6. 確定關(guān)鍵字效率

  mysql> show status like '%key_read%';+-------------------+-----------+| Variable_name | Value |+-------------------+-----------+| Key_read_requests | 163554268 || Key_reads | 98247 |+-------------------+-----------+2 rows in set (0.00 sec)

  Key_reads 代表命中磁盤的請求個數(shù), Key_read_requests 是總數(shù)。命中磁盤的讀請求數(shù)除以讀請求總數(shù)就是不中比率 ?? 在本例中每 1,000 個請求,大約有 0.6 個沒有命中內(nèi)存。如果每 1,000 個請求中命中磁盤的數(shù)目超過 1 個,就應(yīng)該考慮增大關(guān)鍵字緩沖區(qū)了。例如,key_buffer = 384M 會將緩沖區(qū)設(shè)置為 384MB。

  臨時表可以在更高級的查詢中使用,其中數(shù)據(jù)在進(jìn)一步進(jìn)行處理(例如 GROUP BY 字句)之前,都必須先保存到臨時表中;理想情況下,在內(nèi)存中創(chuàng)建臨時表。但是如果臨時表變得太大,就需要寫入磁盤中。清單 7 給出了與臨時表創(chuàng)建有關(guān)的統(tǒng)計(jì)信息。

  清單 7. 確定臨時表的使用

  mysql> SHOW STATUS LIKE 'created_tmp%';+-------------------------+-------+| Variable_name | Value |+-------------------------+-------+| Created_tmp_disk_tables | 30660 || Created_tmp_files | 2 || Created_tmp_tables | 32912 |+-------------------------+-------+3 rows in set (0.00 sec)

  每次使用臨時表都會增大 Created_tmp_tables;基于磁盤的表也會增大 Created_tmp_disk_tables。對于這個比率,并沒有什么嚴(yán)格的規(guī)則,因?yàn)檫@依賴于所涉及的查詢。長時間觀察 Created_tmp_disk_tables 會顯示所創(chuàng)建的磁盤表的比率,您可以確定設(shè)置的效率。 tmp_table_size 和 max_heap_table_size 都可以控制臨時表的最大大小,因此請確保在 my.cnf 中對這兩個值都進(jìn)行了設(shè)置。

  每個會話的設(shè)置

  下面這些設(shè)置針對于每個會話。在設(shè)置這些數(shù)字時要十分謹(jǐn)慎,因?yàn)樗鼈冊诔艘钥赡艽嬖诘倪B接數(shù)時候,這些選項(xiàng)表示大量的內(nèi)存!您可以通過代碼修改會話中的這些數(shù)字,或者在 my.cnf 中為所有會話修改這些設(shè)置。

  當(dāng) MySQL 必須要進(jìn)行排序時,就會在從磁盤上讀取數(shù)據(jù)時分配一個排序緩沖區(qū)來存放這些數(shù)據(jù)行。如果要排序的數(shù)據(jù)太大,那么數(shù)據(jù)就必須保存到磁盤上的臨時文件中,并再次進(jìn)行排序。如果 sort_merge_passes 狀態(tài)變量很大,這就指示了磁盤的活動情況。清單 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 也會分配一些內(nèi)存來讀取表。理想情況下,索引提供了足夠多的信息,可以只讀入所需要的行,但是有時候查詢(設(shè)計(jì)不佳或數(shù)據(jù)本性使然)需要讀取表中大量數(shù)據(jù)。要理解這種行為,需要知道運(yùn)行了多少個 SELECT 語句,以及需要讀取表中的下一行數(shù)據(jù)的次數(shù)(而不是通過索引直接訪問)。實(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。如果該值超過 4000,就應(yīng)該查看 read_buffer_size,例如 read_buffer_size = 4M。如果這個數(shù)字超過了 8M,就應(yīng)該與開發(fā)人員討論一下對這些查詢進(jìn)行調(diào)優(yōu)了!

  3 個必不可少的工具

  盡管在了解具體設(shè)置時,SHOW STATUS 命令會非常有用,但是您還需要一些工具來解釋 mysqld 所提供的大量數(shù)據(jù)。我發(fā)現(xiàn)有 3 個工具是必不可少的;在 參考資料 一節(jié)中您可以找到相應(yīng)的鏈接。

  大部分系統(tǒng)管理員都非常熟悉 top 命令,它為任務(wù)所消耗的 CPU 和內(nèi)存提供了一個不斷更新的視圖。 mytop 對 top 進(jìn)行了仿真;它為所有連接上的客戶機(jī)以及它們正在運(yùn)行的查詢提供了一個視圖。mytop 還提供了一個有關(guān)關(guān)鍵字緩沖區(qū)和查詢緩存效率的實(shí)時數(shù)據(jù)和歷史數(shù)據(jù),以及有關(guān)正在運(yùn)行的查詢的統(tǒng)計(jì)信息。這是一個很有用的工具,可以查看系統(tǒng)中(比如 10 秒鐘之內(nèi))的狀況,您可以獲得有關(guān)服務(wù)器健康信息的視圖,并顯示導(dǎo)致問題的任何連接。

  mysqlard 是一個連接到 MySQL 服務(wù)器上的守護(hù)程序,負(fù)責(zé)每 5 分鐘搜集一次數(shù)據(jù),并將它們存儲到后臺的一個 Round Robin Database 中。有一個 Web 頁面會顯示這些數(shù)據(jù),例如表緩存的使用情況、關(guān)鍵字效率、連接上的客戶機(jī)以及臨時表的使用情況。盡管 mytop 提供了服務(wù)器健康信息的快照,但是 mysqlard 則提供了長期的健康信息。作為獎勵,mysqlard 使用自己搜集到的一些信息針對如何對服務(wù)器進(jìn)行調(diào)優(yōu)給出一些建議。

  搜集 SHOW STATUS 信息的另外一個工具是 mysqlreport。其報(bào)告要遠(yuǎn)比 mysqlard 更加復(fù)雜,因?yàn)樾枰獙Ψ⻊?wù)器的每個方面都進(jìn)行分析。這是對服務(wù)器進(jìn)行調(diào)優(yōu)的一個非常好的工具,因?yàn)樗鼘顟B(tài)變量進(jìn)行適當(dāng)計(jì)算來幫助確定需要修正哪些問題。

關(guān)鍵詞:查詢   調(diào)優(yōu)

分享到:

頂部 】 【 關(guān)閉
版權(quán)所有:佛山思海電腦網(wǎng)絡(luò)有限公司 ©1998-2024 All Rights Reserved.
聯(lián)系電話:(0757)22630313、22633833
中華人民共和國增值電信業(yè)務(wù)經(jīng)營許可證: 粵B1.B2-20030321 備案號:粵B2-20030321-1
網(wǎng)站公安備案編號:44060602000007 交互式欄目專項(xiàng)備案編號:200303DD003  
察察 工商 網(wǎng)安 舉報(bào)有獎  警警  手機(jī)打開網(wǎng)站