參數的調整可以通過修改 /etc/my.cnf 文件並重啟 MySQL實現。這是一個比較謹慎的工作,上面的結果也僅僅是我的一些看法,你可以根據你自己主機的硬件情況(特別是內存大小)進一步修改。
同時在線訪問量繼續增大 對於1G內存的服務器明顯感覺到吃力嚴重時甚至每天都會死機或者時不時的服務器卡一下 這個問題曾經困擾了我半個多月MySQL使用是很具伸縮性的算法,因此你通常能用很少的內存運行或給MySQL更多的被存以得到更好的性能。
安裝好mysql後,配製文件應該在/usr/local/mysql/share/mysql目錄中,配製文件有幾個,有my-huge.cnf my-medium.cnf my-large.cnf my-small.cnf,不同的流量的網站和不同配製的服務器環境,當然需要有不同的配製文件了。
一般的情況下,my- medium.cnf這個配製文件就能滿足我們的大多需要;一般我們會把配置文件拷貝到/etc/my.cnf 只需要修改這個配置文件就可以了,使用mysqladminvariables extended-status –u root –p 可以看到目前的參數,有3個配置參數是最重要的,即key_buffer_size,query_cache_size,table_cache。
關鍵詞解釋
key_buffer_size:
索 引塊是緩衝的並且被所有的線程共享。key_buffer_size是用於索引塊的緩衝區大小,增加它可得到更好處理的索引(對所有讀和多重寫),到你能 負擔得起那樣多。如果你使它太大,系統將開始換頁並且真的變慢了。默認數值是8388600(8M),我的MySQL主機有2GB內存,所以我把它改為 402649088(400MB)。
註:通過檢查狀態值Key_read_requests和Key_reads,可以知道 key_buffer_size設置是否合理。比例 key_reads / key_read_requests應該盡可能的低,至少是1:100,1:1000更好(上述狀態值可以使用SHOW STATUS LIKE『key_read%』獲得)。 或者如果你裝了phpmyadmin 可以通過服務器運行狀態看到,筆者推薦用phpmyadmin管理mysql,狀態值都是本人通過phpmyadmin獲得的實例
另外一個估計key_buffer_size的辦法 把你網站數據庫的每個表的索引所佔空間大小加起來看看以此服務器為例:比較大的幾個表索引加起來大概125M 這個數字會隨著表變大而變大。
key_buffer_size只對MyISAM表起作用
另外一個估計key_buffer_size的辦法 把你網站數據庫的每個表的索引所佔空間大小加起來看看以此服務器為例:比較大的幾個表索引加起來大概125M 這個數字會隨著表變大而變大。
max_connections:
允許的同時客戶的數量。增加該值增加 mysqld 要求的文件描述符的數量。這個數字應該增加,否則,你將經常看到 鏈接過多,請聯繫空間商 錯誤。 默認數值是100
sort_buffer:
每個需要進行排序的線程分配該大小的一個緩衝區。增加這值加速ORDER BY或GROUP BY操作。默認數值是2097144(2M)
back_log:
要求 MySQL 能有的連接數量。當主要MySQL線程在一個很短時間內得到非常多的連接請求,這就起作用,然後主線程花些時間(儘管很短)檢查連接並且啟動一個新線程。
back_log 值指出在MySQL暫時停止回答新請求之前的短時間內多少個請求可以被存在堆棧中。只有如果期望在一個短時間內有很多連接,你需要增加 它,換句話說,這值對到來的TCP/IP連接的偵聽隊列的大小。你的操作系統在這個隊列大小上有它自己的限制。 試圖設定back_log高於你的操作系統的限制將是無效的。
當你觀察你的主機進程列表,發現大量 264084 | unauthenticated user |xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL 的待連接進程時,就要加大 back_log 的值了。默認數值是50,我把它改為更多。
interactive_timeout:
服務器在關閉它前在一個交互連接上等待行動的秒數。一個交互的客戶被定義為對 mysql_real_connect()使用 CLIENT_INTERACTIVE 選項的客戶。 默認數值是28800,我把它改為7200。
record_buffer:
每個進行一個順序掃瞄的線程為其掃瞄的每張表分配這個大小的一個緩衝區。如果你做很多順序掃瞄,你可能想要增加該值。默認數值是131072(128K),我把它改為16773120(16M)
table_cache:
為所有線程打開表的數量。增加該值能增加mysqld要求的文件描述符的數量。MySQL對每個唯一打開的表需要2個文件描述符。默認數值是64,我把它改為512。
優 化table_cachetable_cache指定表高速緩存的大小。每當MySQL訪問一個表時,如果在表緩衝區中還有空間,該表就被打開並放入其 中,這樣可以更快地訪問表內容。通過檢查峰值時間的狀態值Open_tables和Opened_tables,可以決定是否需要增加 table_cache的值。如果你發現open_tables等於table_cache,並且opened_tables在不斷增長,那麼你就需要增 加table_cache的值了(上述狀態值可以使用SHOW STATUSLIKE 『Open%tables』獲得)。注意,不能盲目地把table_cache設置成很大的值。如果設置得太高,可能會造成文件描述符不足,從而造成性能 不穩定或者連接失敗。對於有1G內存的機器,推薦值是128-256。
案例1:該案例來自一個不是特別繁忙的服務器table_cache – 512open_tables – 103opened_tables – 1273uptime –4021421 (measured in seconds)該案例中table_cache似乎設置得太高了。在峰值時間,打開表的數目比table_cache要少得多。
案例2:該案例 來自一台 開發服務器。table_cache – 64open_tables – 64opened-tables – 431uptime – 1662790(measured in seconds)雖然open_tables已經等於table_cache,但是相對於服務器運行時間來說,opened_tables的值也非常低。 因此,增加table_cache的值應該用處不大。
案例3:該案例來自一個upderperforming的服務器table_cache – 64open_tables – 64opened_tables – 22423uptime – 19538該案例中table_cache設置得太低了。雖然運行時間不到6小時,open_tables達到了最大值,opened_tables的值 也非常高。這樣就需要增加table_cache的值
筆者設置table_cache = 256
得到以下狀態:
Open tables 256
Opened tables 9046
雖 然open_tables已經等於table_cache,但是相對於服務器運行時間來說,已經運行了20天,opened_tables的值也非常 低。因此,增加table_cache的值應該用處不大。如果運行了6個小時就出現上述值 那就要考慮增大table_cache。
thread_cache_size:
可 以復用的,保存在中的線程的數量。如果有,新的線程從緩存中取得,當斷開連接的時候如果有空間,客戶的線置在緩存中。如果有很多新的線程,為了提高性能可 以這個變量值。通過比較 Connections 和Threads_created 狀態的變量,可以看到這個變量的作用。我把它設置為 80。
wait_timeout:
服務器在關閉它之前在一個連接上等待行動的秒數。 默認數值是28800
從4.0.1開始,MySQL提供了查詢緩衝機制。使用查詢緩衝,MySQL將SELECT語句和查詢結果存放在緩衝區中,今後對於同樣的SELECT語句(區分大小寫),將直接從緩衝區中讀取結果。根據MySQL用戶手冊,使用查詢緩衝最多可以達到238%的效率。
通過調節以下幾個參數可以知道query_cache_size設置得是否合理
Qcache inserts
Qcache hits
Qcache lowmem prunes
Qcache free blocks
Qcache total blocks
Qcache_lowmem_prunes 的值非常大,則表明經常出現緩衝不夠的情況,同時Qcache_hits的值非常大,則表明查詢緩衝使用非常頻繁,此時需要增加緩衝大小 Qcache_hits的值不大,則表明你的查詢重複率很低,這種情況下使用查詢緩衝反而會影響效率,那麼可以考慮不用查詢緩衝。此外,在SELECT語 句中加入SQL_NO_CACHE可以明確表示不使用查詢緩衝。
Qcache_free_blocks,如果該值非常大,則表明緩衝區中碎片很多query_cache_type指定是否使用查詢緩衝
我設置:
query_cache_size = 32M
query_cache_type= 1
得到如下狀態值:
Qcache queries in cache 12737 表明目前緩存的條數
Qcache inserts 20649006
Qcache hits 79060095 看來重複查詢率還挺高的
Qcache lowmem prunes 617913 有這麼多次出現緩存過低的情況
Qcache not cached 189896
Qcache free memory 18573912 目前剩餘緩存空間
Qcache free blocks 5328 這個數字似乎有點大 碎片不少
Qcache total blocks 30953
如果內存允許32M應該要往上加點
Log_bin
如 果你不需要記錄2進制log 就把這個功能關掉,注意關掉以後就不能恢復出問題前的數據了,需要您手動備份,二進制日誌包含所有更新數據的語句,其目的是在恢復數據庫時用它來把數據盡 可能恢復到最後的狀態。另外,如果做同步複製( Replication )的話,也需要使用二進制日誌傳送修改情況。
log_bin指定 日誌文件,如果不提供文件名,MySQL將自己產生缺省文件名。MySQL會在文件名後面自動添加數字引,每次啟動服務時,都會重新生成一個新的二進制文 件。此外,使用log-bin-index可以指定索引文件;使用binlog-do-db可以指定記錄的數據庫;使用binlog- ignore-db可以指定不記錄的數據庫。注意的是:binlog-do-db和binlog-ignore-db一次只指定一個數據庫,指定多個數據 庫需要多個語句。而且,MySQL會將所有的數據庫名稱改成小寫,在指定數據庫時必須全部使用小寫名字,否則不會起作用。
關掉這個功能只需要在他前面加上#號
#log-bin
開啟慢查詢日誌( slowquery log )
慢查詢日誌對於跟蹤有問題的查詢非常有用。它記錄所有查過long_query_time的查詢,如果需要,還可以記錄不使用索引的記錄。下面是一個慢查詢日誌的例子:
開啟慢查詢日誌,需要設置參數log_slow_queries、long_query_times-1=、log-queries-not-using-indexes。
log_slow_queries 指定日誌文件,如果不提供文件名,MySQL將自己產生缺省文件名。long_query_times指定慢查詢的閾值,缺省是10秒。log- queries-not-using-indexes是4.1.0以後引入的參數,它指示記錄不使用索引的查詢。筆者設置 long_query_time=10
thread_concurrency
#設置為你的cpu數目x2,例如,只有一個cpu,那麼thread_concurrency=2
#有2個cpu,那麼thread_concurrency=8
skip-innodb
#去掉innodb支持
補充
mysql優化 my.ini示例
[mysqld]
basedir=D:/mysql
datadir=D:/mysql/data
#port=3306
skip-bdb
skip-innodb
skip-locking
#skip-networking
max_connections=500
key_buffer=384M
max_allowed_packet=1M
table_cache=512
sort_buffer=2M
record_buffer=2M
thread_cache=8
thread_concurrency=8
wait_timeout=6
[isamchk]
key_buffer=64M
sort_buffer=64M
read_buffer=2M
write_buffer=2M
[myisamchk]
key_buffer=64M
sort_buffer=64M
read_buffer=2M
write_buffer=2M
以下所有命令都是在進入mysql監控器中執行的:
a. show tables或show tables from database_name; // 顯示當前數據庫中所有表的名稱
b. show databases; // 顯示mysql中所有數據庫的名稱
c. show columns from table_namefrom database_name; 或show columns from database_name.table_name; // 顯示表中列名稱
d. show grants for user_name; // 顯示一個用戶的權限,顯示結果類似於grant 命令
e. show index from table_name; // 顯示表的索引
f. show status; // 顯示一些系統特定資源的信息,例如,正在運行的線程數量
g. show variables; // 顯示系統變量的名稱和值
h. show processlist; // 顯示系統中正在運行的所有進程,也就是當前正在執行的查詢。大多數用戶可以查看
他們自己的進程,但是如果他們擁有process權限,就可以查看所有人的進程,包括密碼。
i. show table status; // 顯示當前使用或者指定的database中的每個表的信息。信息包括表類型和表的最新更新時間
j. show privileges; // 顯示服務器所支持的不同權限
k. show create databasedatabase_name; // 顯示create database 語句是否能夠創建指定的數據庫
l. show create table table_name;// 顯示create database 語句是否能夠創建指定的數據庫
m. show engines; // 顯示安裝以後可用的存儲引擎和默認引擎。
n. show innodb status; // 顯示innoDB存儲引擎的狀態
o. show logs; // 顯示BDB存儲引擎的日誌
p. show warnings; // 顯示最後一個執行的語句所產生的錯誤、警告和通知
q. show errors; // 只顯示最後一個執行語句所產生的錯誤
留言列表