?? manual_performance.html
字號:
delayed_queue_size current value: 1000
flush_time current value: 0
interactive_timeout current value: 28800
join_buffer_size current value: 131072
key_buffer_size current value: 1048540
lower_case_table_names current value: 0
long_query_time current value: 10
max_allowed_packet current value: 1048576
max_connections current value: 100
max_connect_errors current value: 10
max_delayed_threads current value: 20
max_heap_table_size current value: 16777216
max_join_size current value: 4294967295
max_sort_length current value: 1024
max_tmp_tables current value: 32
max_write_lock_count current value: 4294967295
net_buffer_length current value: 16384
query_buffer_size current value: 0
record_buffer current value: 131072
sort_buffer current value: 2097116
table_cache current value: 64
thread_concurrency current value: 10
tmp_table_size current value: 1048576
thread_stack current value: 131072
wait_timeout current value: 28800
</pre>
<p>如果有一個<code>mysqld</code>服務器正在運行,通過執行這個命令,你可以看到它實際上使用的變量的值:
</p>
<pre>shell> mysqladmin variables
</pre>
<p>每個選項在下面描述。對于緩沖區大小、長度和棧大小的值以字節給出,你能用于個后綴<samp>“K”</samp>或<samp>“M”</samp>
指出以K字節或兆字節顯示值。例如,<code>16M</code>指出16兆字節。后綴字母的大小寫沒有關系;<code>16M</code>和<code>16m</code>是相同的。
</p>
<p>你也可以用命令<code>SHOW STATUS</code>自一個運行的服務器看見一些統計。見<a HREF="manual_Reference.html#SHOW">7.21<code> SHOW</code>語法(得到表、列的信息)</a>。
<dl COMPACT="manual_Reference.html#SHOW">
<dt><code><code>back_log</code></code> </dt>
<dd>要求<strong>MySQL</strong>能有的連接數量。當主要<strong>MySQL</strong>線程在一個很短時間內得到<strong>非常</strong>多的連接請求,這就起作用,然后主線程花些時間(盡管很短)檢查連接并且啟動一個新線程。<code>back_log</code>值指出在<strong>MySQL</strong>暫時停止回答新請求之前的短時間內多少個請求可以被存在堆棧中。只有如果期望在一個短時間內有很多連接,你需要增加它,換句話說,這值對到來的TCP/IP連接的偵聽隊列的大小。你的操作系統在這個隊列大小上有它自己的限制。
Unix <code>listen(2)</code>系統調用的手冊頁應該有更多的細節。檢查你的OS文檔找出這個變量的最大值。試圖設定<code>back_log</code>高于你的操作系統的限制將是無效的。
</dd>
<dt><code><code>connect_timeout</code></code> </dt>
<dd><code>mysqld</code>服務器在用<code>Bad handshake</code>(糟糕的握手)應答前正在等待一個連接報文的秒數。
</dd>
<dt><code><code>delayed_insert_timeout</code></code> </dt>
<dd>一個<code>INSERT DELAYED</code>線程應該在終止之前等待<code>INSERT</code>語句的時間。
</dd>
<dt><code><code>delayed_insert_limit</code></code> </dt>
<dd>在插入<code>delayed_insert_limit</code>行后,<code>INSERT DELAYED</code>處理器將檢查是否有任何<code>SELECT</code>語句未執行。如果這樣,在繼續前執行允許這些語句。
</dd>
<dt><code><code>delayed_queue_size</code></code> </dt>
<dd>應該為處理<code>INSERT DELAYED</code>分配多大一個隊列(以行數)。如果排隊滿了,任何進行<code>INSERT
DELAYED</code>的客戶將等待直到隊列又有空間了。 </dd>
<dt><code><code>flush_time</code></code> </dt>
<dd>如果這被設置為非零值,那么每<code>flush_time</code>秒所有表將被關閉(以釋放資源和sync到磁盤)。
</dd>
<dt><code><code>interactive_timeout</code></code> </dt>
<dd>服務器在關上它前在一個交互連接上等待行動的秒數。一個交互的客戶被定義為對<code>mysql_real_connect()</code>使用<code>CLIENT_INTERACTIVE</code>選項的客戶。也可見<code>wait_timeout</code>。
</dd>
<dt><code><code>join_buffer_size</code></code> </dt>
<dd>用于全部聯結(join)的緩沖區大小(不是用索引的聯結)。緩沖區對2個表間的每個全部聯結分配一次緩沖區,當增加索引不可能時,增加該值可得到一個更快的全部聯結。(通常得到快速聯結的最佳方法是增加索引。)</dd>
<dt><code><code>key_buffer_size</code></code> </dt>
<dd>索引塊是緩沖的并且被所有的線程共享。<code>key_buffer_size</code>是用于索引塊的緩沖區大小,增加它可得到更好處理的索引(對所有讀和多重寫),到你能負擔得起那樣多。如果你使它太大,系統將開始換頁并且真的變慢了。記住既然<strong>MySQL</strong>不緩存讀取的數據,你將必須為OS文件系統緩存留下一些空間。為了在寫入多個行時得到更多的速度,使用<code>LOCK
TABLES</code>。見<a HREF="manual_Reference.html#LOCK_TABLES">7.24<code>LOCK
TABLES/UNLOCK TABLES</code>語法</a>。 </dd>
<dt><code><code>long_query_time</code></code> </dt>
<dd>如果一個查詢所用時間超過它(以秒計),<code>Slow_queries</code>記數器將被增加。
</dd>
<dt><code><code>max_allowed_packet</code></code> </dt>
<dd>一個包的最大尺寸。消息緩沖區被初始化為<code>net_buffer_length</code>字節,但是可在需要時增加到<code>max_allowed_packet</code>個字節。缺省地,該值太小必能捕捉大的(可能錯誤)包。如果你正在使用大的<code>BLOB</code>列,你必須增加該值。它應該象你想要使用的最大<code>BLOB</code>的那么大。
</dd>
<dt><code><code>max_connections</code></code> </dt>
<dd>允許的同時客戶的數量。增加該值增加<code>mysqld</code>要求的文件描述符的數量。見下面對文件描述符限制的注釋。見<a HREF="manual_Problems.html#Too_many_connections">18.2.4<code> Too many connections</code>錯誤</a>。
</dd>
<dt><code><code>max_connect_errors</code></code> </dt>
<dd>如果有多于該數量的從一臺主機中斷的連接,這臺主機阻止進一步的連接。你可用<code>FLUSH
HOSTS</code>命令疏通一臺主機。 </dd>
<dt><code><code>max_delayed_threads</code></code> </dt>
<dd>不要啟動多于的這個數字的線程來處理<code>INSERT DELAYED</code>語句。如果你試圖在所有<code>INSERT
DELAYED</code>線程在用后向一張新表插入數據,行將被插入,就像<code>DELAYED</code>屬性沒被指定那樣。
</dd>
<dt><code><code>max_join_size</code></code> </dt>
<dd>可能將要讀入多于<code>max_join_size</code>個記錄的聯結將返回一個錯誤。如果你的用戶想要執行沒有一個<code>WHERE</code>子句、花很長時間并且返回百萬行的聯結,設置它。
</dd>
<dt><code><code>max_sort_length</code></code> </dt>
<dd>在排序<code>BLOB</code>或<code>TEXT</code>值時使用的字節數(每個值僅頭<code>max_sort_length</code>個字節被使用;其余的被忽略)。
</dd>
<dt><code><code>max_tmp_tables</code></code> </dt>
<dd>(該選擇目前還不做任何事情)。一個客戶能同時保持打開的臨時表的最大數量。
</dd>
<dt><code><code>net_buffer_length</code></code> </dt>
<dd>通信緩沖區在查詢之間被重置到該大小。通常這不應該被改變,但是如果你有很少的內存,你能將它設置為查詢期望的大小。(即,客戶發出的SQL語句期望的長度。如果語句超過這個長度,緩沖區自動地被擴大,直到<code>max_allowed_packet</code>個字節。)</dd>
<dt><code><code>record_buffer</code></code> </dt>
<dd>每個進行一個順序掃描的線程為其掃描的每張表分配這個大小的一個緩沖區。如果你做很多順序掃描,你可能想要增加該值。
</dd>
<dt><code><code>sort_buffer</code></code> </dt>
<dd>每個需要進行排序的線程分配該大小的一個緩沖區。增加這值加速<code>ORDER
BY</code>或<code>GROUP BY</code>操作。見<a HREF="manual_Problems.html#Temporary_files">18.5 MySQL在哪兒存儲臨時文件</a>。 </dd>
<dt><code><code>table_cache</code></code> </dt>
<dd>為所有線程打開表的數量。增加該值能增加<code>mysqld</code>要求的文件描述符的數量。<strong>MySQL</strong>對每個唯一打開的表需要2個文件描述符,見下面對文件描述符限制的注釋。對于表緩存如何工作的信息,見<a HREF="manual_Performance.html#Table_cache">10.2.4 MySQL怎樣打開和關閉表</a>。 </dd>
<dt><code><code>tmp_table_size</code></code> </dt>
<dd>如果一張臨時表超出該大小,<strong>MySQL</strong>產生一個<code>The table
tbl_name is full</code>形式的錯誤,如果你做很多高級<code>GROUP BY</code>查詢,增加<code>tmp_table_size</code>值。
</dd>
<dt><code><code>thread_stack</code></code> </dt>
<dd>每個線程的棧大小。由<code>crash-me</code>測試檢測到的許多限制依賴于該值。缺省隊一般的操作是足夠大了。見<a HREF="manual_Performance.html#Benchmarks">10.8 使用你自己的基準</a>。 </dd>
<dt><code><code>wait_timeout</code></code> </dt>
<dd>服務器在關閉它之前在一個連接上等待行動的秒數。也可見<code>interactive_timeout</code>。
</dd>
</dl>
<p><strong>MySQL</strong>使用是很具伸縮性的算法,因此你通常能用很少的內存運行或給<strong>MySQL</strong>更多的被存以得到更好的性能。
</p>
<p>如果你有很多內存和很多表并且有一個中等數量的客戶,想要最大的性能,你應該一些象這樣的東西:
</p>
<pre>shell> safe_mysqld -O key_buffer=16M -O table_cache=128 \
-O sort_buffer=4M -O record_buffer=1M &
如果你有較少的內存和大量的連接,使用這樣一些東西: </pre>
<pre>shell> safe_mysqld -O key_buffer=512k -O sort_buffer=100k \
-O record_buffer=100k &
</pre>
<pre>或甚至: </pre>
<pre>shell> safe_mysqld -O key_buffer=512k -O sort_buffer=16k \
-O table_cache=32 -O record_buffer=8k -O net_buffer=1K &
</pre>
<p>如果有很多連接,“交換問題”可能發生,除非<code>mysqld</code>已經被配置每個連接使用很少的內存。當然如果你對所有連接有足夠的內存,<code>mysqld</code>執行得更好。
</p>
<p>注意,如果你改變<code>mysqld</code>的一個選項,它實際上只對服務器的那個例子保持。
</p>
<p>為了明白一個參數變化的效果,這樣做: </p>
<pre>shell> mysqld -O key_buffer=32m --help
</pre>
<p>保證<code>--help</code>選項是最后一個;否則,命令行上在它之后列出的任何選項的效果將不在反映在輸出中。
</p>
<h3><a NAME="Table_cache" HREF="manual_toc.html#Table_cache">10.2.4 MySQL怎樣打開和關閉數據庫表</a></h3>
<p><code>table_cache</code>, <code>max_connections</code>和<code>max_tmp_tables</code>影響服務器保持打開的文件的最大數量。如果你增加這些值的一個或兩個,你可以遇到你的操作系統每個進程打開文件描述符的數量上強加的限制。然而,你可以能在許多系統上增加該限制。請教你的OS文檔找出如何做這些,因為改變限制的方法各系統有很大的不同。
</p>
<p><code>table_cache</code>與<code>max_connections</code>有關。例如,對于200個打開的連接,你應該讓一張表的緩沖至少<code>有200
* n</code>,這里<code>n</code>是一個聯結(join)中表的最大數量。 </p>
<p>打開表的緩存可以增加到一個<code>table_cache</code>的最大值(缺省為64;這可以用<code>mysqld</code>的<code>-O
table_cache=#</code>選項來改變)。一個表絕對不被關閉,除非當緩存滿了并且另外一個線程試圖打開一個表時或如果你使用<code>mysqladmin
refresh</code>或<code>mysqladmin flush-tables</code>。 </p>
<p>當表緩存滿時,服務器使用下列過程找到一個緩存入口來使用:
<ul>
<li>不是當前使用的表被釋放,以最近最少使用(LRU)順序。 </li>
<li>如果緩存滿了并且沒有表可以釋放,但是一個新表需要打開,緩存必須臨時被擴大。
</li>
<li>如果緩存處于一個臨時擴大狀態并且一個表從在用變為不在用狀態,它被關閉并從緩存中釋放。
</li>
</ul>
<p>對每個并發存取打開一個表。這意味著,如果你讓2個線程存取同一個表或在同一個查詢中存取表兩次(用<code>AS</code>),表需要被打開兩次。任何表的第一次打開占2個文件描述符;表的每一次額外使用僅占一個文件描述符。對于第一次打開的額外描述符用于索引文件;這個描述符在所有線程之間共享。
</p>
<h3><a NAME="Creating_many_tables" HREF="manual_toc.html#Creating_many_tables">10.2.5
在同一個數據庫中創建大量數據庫表的缺點</a></h3>
<p>如果你在一個目錄中有許多文件,打開、關閉和創建操作將會很慢。如果你執行在許多不同表上的<code>SELECT</code>語句,當表緩存滿時,將有一點開銷,因為對每個必須打開的表,另外一個必須被關閉。你可以通過使表緩沖更大些來減少這個開銷。
</p>
<h3><a NAME="Open_tables" HREF="manual_toc.html#Open_tables">10.2.6
為什么有這么多打開的表?</a></h3>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -