本篇內容主要講解“的優(yōu)化方法有哪些”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強。下面就讓小編來(lái)帶大家學(xué)習“mysql的優(yōu)化方法有哪些”吧!
目前項目性能指標是20萬(wàn)用戶(hù),20并發(fā)。用的是Mysql,但是總感覺(jué)性能很差,今天上網(wǎng)查了一下,發(fā)現的確沒(méi)有好好的調整一下性能。先引用一個(gè)wiki,改天調整一下看看
同時(shí)在線(xiàn)訪(fǎng)問(wèn)量繼續增大 對于1G內存的明顯感覺(jué)到吃力嚴重時(shí)甚至每天都會(huì )死機 或者時(shí)不時(shí)的服務(wù)器卡一下 這個(gè)問(wèn)題曾經(jīng)困擾了我半個(gè)多月MySQL使用是很具伸縮性的算法,因此你通常能用很少的內存運行或給MySQL更多的被存以得到更好的性能。
安裝好mysql后,配制文件應該在/usr/local/mysql/share/mysql目錄中,配制文件有幾個(gè),有my-huge.cnf my-medium.cnf my-large.cnf my-small.cnf,不同的流量的網(wǎng)站和不同配制的服務(wù)器環(huán)境,當然需要有不同的配制文件了。
一般的情況下,my-medium.cnf這個(gè)配制文件就能滿(mǎn)足我們的大多需要;一般我們會(huì )把配置文件拷貝到/etc/my.cnf 只需要修改這個(gè)配置文件就可以了,使用mysqladmin variables extended-status –u root –p 可以看到目前的參數,有3個(gè)配置參數是最重要的,即key_buffer_size,query_cache_size,table_cache。
key_buffer_size只對MyISAM表起作用,
key_buffer_size指定索引緩沖區的大小,它決定索引處理的速度,尤其是索引讀的速度。一般我們設為16M,實(shí)際上稍微大一點(diǎn)的站點(diǎn) 這個(gè)數字是遠遠不夠的,通過(guò)檢查狀態(tài)值Key_read_requests和Key_reads,可以知道key_buffer_size設置是否合理。比例key_reads / key_read_requests應該盡可能的低,至少是1:100,1:1000更好(上述狀態(tài)值可以使用SHOW STATUS LIKE ‘key_read%’獲得)。 或者如果你裝了phpmyadmin 可以通過(guò)服務(wù)器運行狀態(tài)看到,筆者推薦用phpmyadmin管理mysql,以下的狀態(tài)值都是本人通過(guò)phpmyadmin獲得的實(shí)例分析:
這個(gè)服務(wù)器已經(jīng)運行了20天
key_buffer_size – 128M
key_read_requests – 650759289
key_reads - 79112
比例接近1:8000 健康狀況非常好
另外一個(gè)估計key_buffer_size的辦法 把你網(wǎng)站數據庫的每個(gè)表的索引所占空間大小加起來(lái)看看以此服務(wù)器為例:比較大的幾個(gè)表索引加起來(lái)大概125M 這個(gè)數字會(huì )隨著(zhù)表變大而變大。
從4.0.1開(kāi)始,MySQL提供了查詢(xún)緩沖機制。使用查詢(xún)緩沖,MySQL將SELECT語(yǔ)句和查詢(xún)結果存放在緩沖區中,今后對于同樣的SELECT語(yǔ)句(區分大小寫(xiě)),將直接從緩沖區中讀取結果。根據MySQL用戶(hù)手冊,使用查詢(xún)緩沖最多可以達到238%的效率。
通過(guò)調節以下幾個(gè)參數可以知道query_cache_size設置得是否合理
Qcache inserts
Qcache hits
Qcache lowmem prunes
Qcache free blocks
Qcache total blocks
Qcache_lowmem_prunes的值非常大,則表明經(jīng)常出現緩沖不夠的情況,同時(shí)Qcache_hits的值非常大,則表明查詢(xún)緩沖使用非常頻繁,此時(shí)需要增加緩沖大小Qcache_hits的值不大,則表明你的查詢(xún)重復率很低,這種情況下使用查詢(xún)緩沖反而會(huì )影響效率,那么可以考慮不用查詢(xún)緩沖。此外,在SELECT語(yǔ)句中加入SQL_NO_CACHE可以明確表示不使用查詢(xún)緩沖。
Qcache_free_blocks,如果該值非常大,則表明緩沖區中碎片很多query_cache_type指定是否使用查詢(xún)緩沖
我設置:
query_cache_size = 32M
query_cache_type= 1
得到如下?tīng)顟B(tài)值:
Qcache queries in cache 12737 表明目前緩存的條數
Qcache inserts 20649006
Qcache hits 79060095 看來(lái)重復查詢(xún)率還挺高的
Qcache lowmem prunes 617913 有這么多次出現緩存過(guò)低的情況
Qcache not cached 189896
Qcache free memory 18573912 目前剩余緩存空間
Qcache free blocks 5328 這個(gè)數字似乎有點(diǎn)大 碎片不少
Qcache total blocks 30953
如果內存允許32M應該要往上加點(diǎn)
table_cache指定表高速緩存的大小。每當MySQL訪(fǎng)問(wèn)一個(gè)表時(shí),如果在表緩沖區中還有空間,該表就被打開(kāi)并放入其中,這樣可以更快地訪(fǎng)問(wèn)表內容。通過(guò)檢查峰值時(shí)間的狀態(tài)值Open_tables和Opened_tables,可以決定是否需要增加table_cache的值。如果你發(fā)現open_tables等于table_cache,并且opened_tables在不斷增長(cháng),那么你就需要增加table_cache的值了(上述狀態(tài)值可以使用SHOW STATUS LIKE ‘Open%tables’獲得)。注意,不能盲目地把table_cache設置成很大的值。如果設置得太高,可能會(huì )造成文件描述符不足,從而造成性能不穩定或者連接失敗。
對于有1G內存的機器,推薦值是128-256。
筆者設置table_cache = 256
得到以下?tīng)顟B(tài):
Open tables 256 Opened tables 9046
雖然open_tables已經(jīng)等于table_cache,但是相對于服務(wù)器運行時(shí)間來(lái)說(shuō),已經(jīng)運行了20天,opened_tables的值也非常低。因此,增加table_cache的值應該用處不大。如果運行了6個(gè)小時(shí)就出現上述值 那就要考慮增大table_cache。
如果你不需要記錄2進(jìn)制log 就把這個(gè)功能關(guān)掉,注意關(guān)掉以后就不能恢復出問(wèn)題前的數據了,需要您手動(dòng)備份,二進(jìn)制日志包含所有更新數據的語(yǔ)句,其目的是在恢復數據庫時(shí)用它來(lái)把數據盡可能恢復到最后的狀態(tài)。另外,如果做同步復制( Replication )的話(huà),也需要使用二進(jìn)制日志傳送修改情況。
log_bin指定日志文件,如果不提供文件名,MySQL將自己產(chǎn)生缺省文件名。MySQL會(huì )在文件名后面自動(dòng)添加數字引,每次啟動(dòng)服務(wù)時(shí),都會(huì )重新生成一個(gè)新的二進(jìn)制文件。此外,使用log-bin-index可以指定索引文件;使用binlog-do-db可以指定記錄的數據庫;使用binlog-ignore-db可以指定不記錄的數據庫。注意的是:binlog-do-db和binlog-ignore-db一次只指定一個(gè)數據庫,指定多個(gè)數據庫需要多個(gè)語(yǔ)句。而且,MySQL會(huì )將所有的數據庫名稱(chēng)改成小寫(xiě),在指定數據庫時(shí)必須全部使用小寫(xiě)名字,否則不會(huì )起作用。
關(guān)掉這個(gè)功能只需要在他前面加上#號
#log-bin
開(kāi)啟慢查詢(xún)日志( slow query log ) 慢查詢(xún)日志對于跟蹤有問(wèn)題的查詢(xún)非常有用。它記錄所有查過(guò)long_query_time的查詢(xún),如果需要,還可以記錄不使用索引的記錄。下面是一個(gè)慢查詢(xún)日志的例子:
開(kāi)啟慢查詢(xún)日志,需要設置參數log_slow_queries、long_query_times、log-queries-not-using-indexes。
log_slow_queries指定日志文件,如果不提供文件名,MySQL將自己產(chǎn)生缺省文件名。long_query_times指定慢查詢(xún)的閾值,缺省是10秒。log-queries-not-using-indexes是4.1.0以后引入的參數,它指示記錄不使用索引的查詢(xún)。筆者設置long_query_time=10
筆者設置:
sort_buffer_size = 1M max_connections=120 wait_timeout =120 back_log=100 read_buffer_size = 1M thread_cache=32 interactive_timeout=120 thread_concurrency = 4
參數說(shuō)明:
back_log
要求MySQL能有的連接數量。當主要MySQL線(xiàn)程在一個(gè)很短時(shí)間內得到非常多的連接請求,這就起作用,然后主線(xiàn)程花些時(shí)間(盡管很短)檢查連接并且啟動(dòng)一個(gè)新線(xiàn)程。back_log值指出在MySQL暫時(shí)停止回答新請求之前的短時(shí)間內多少個(gè)請求可以被存在堆棧中。只有如果期望在一個(gè)短時(shí)間內有很多連接,你需要增加它,換句話(huà)說(shuō),這值對到來(lái)的TCP/IP連接的偵聽(tīng)隊列的大小。你的操作系統在這個(gè)隊列大小上有它自己的限制。 Unix listen(2)系統調用的手冊頁(yè)應該有更多的細節。檢查你的OS文檔找出這個(gè)變量的最大值。試圖設定back_log高于你的操作系統的限制將是無(wú)效的。
max_connections
并發(fā)連接數目最大,120 超過(guò)這個(gè)值就會(huì )自動(dòng)恢復,出了問(wèn)題能自動(dòng)解決
thread_cache
沒(méi)找到具體說(shuō)明,不過(guò)設置為32后 20天才創(chuàng )建了400多個(gè)線(xiàn)程 而以前一天就創(chuàng )建了上千個(gè)線(xiàn)程 所以還是有用的
thread_concurrency
#設置為你的cpu數目x2,例如,只有一個(gè)cpu,那么thread_concurrency=2 #有2個(gè)cpu,那么thread_concurrency=4 skip-innodb #去掉innodb支持
代碼:
# Example MySQL config file for medium systems.
#
# This is for a system with little memory (32M - 64M) where MySQL plays
# an important part, or systems up to 128M where MySQL is used together with
# other programs (such as a web server)
#
# You can copy this file to
# /etc/my.cnf to set global options,
# mysql-data-dir/my.cnf to set server-specific options (in this
# installation this directory is /var/lib/mysql) or
# ~/.my.cnf to set user-specific options.
#
# In this file, you can use all long options that a program supports.
# If you want to know which options a program supports, run the program
# with the "--help" option.
# The following options will be passed to all MySQL clients
[client]
#password = your_password
port = 3306
socket = /tmp/mysql.sock
#socket = /var/lib/mysql/mysql.sock
# Here follows entries for some specific programs
# The MySQL server
[mysqld]
port = 3306
socket = /tmp/mysql.sock
#socket = /var/lib/mysql/mysql.sock
skip-locking
key_buffer = 128M
max_allowed_packet = 1M
table_cache = 256
sort_buffer_size = 1M
net_buffer_length = 16K
myisam_sort_buffer_size = 1M
max_connections=120
#addnew config
wait_timeout =120
back_log=100
read_buffer_size = 1M
thread_cache=32
skip-innodb
skip-bdb
skip-name-resolve
join_buffer_size=512k
query_cache_size = 32M
interactive_timeout=120
long_query_time=10
log_slow_queries= /usr/local/mysql4/logs/slow_query.log
query_cache_type= 1
# Try number of CPU's*2 for thread_concurrency
thread_concurrency = 4
#end new config
# Don't listen on a TCP/IP port at all. This can be a security enhancement,
# if all processes that need to connect to mysqld run on the same host.
# All interaction with mysqld must be made via Unix sockets or named pipes.
# Note that using this option without enabling named pipes on Windows
# (via the "enable-named-pipe" option) will render mysqld useless!
#
#skip-networking
# Replication Master Server (default)
# binary logging is required for replication
#log-bin
# required unique id between 1 and 2^32 - 1
# defaults to 1 if master-host is not set
# but will not function as a master if omitted
server-id = 1
# Replication Slave (comment out master section to use this)
#
# To configure this host as a replication slave, you can choose between
# two methods :
#
# 1) Use the CHANGE MASTER TO command (fully described in our manual) -
# the syntax is:
#
# CHANGE MASTER TO MASTER_HOST=, MASTER_PORT=,
# MASTER_USER=, MASTER_PASSWORD= ;
#
# where you replace , , by quoted strings and
# by the master's port number (3306 by default).
#
# Example:
#
# CHANGE MASTER TO MASTER_HOST='125.564.12.1', MASTER_PORT=3306,
# MASTER_USER='joe', MASTER_PASSWORD='secret';
#
# OR
#
# 2) Set the variables below. However, in case you choose this method, then
# start replication for the first time (even unsuccessfully, for example
# if you mistyped the password in master-password and the slave fails to
# connect), the slave will create a master.info file, and any later
# change in this file to the variables' values below will be ignored and
# overridden by the content of the master.info file, unless you shutdown
# the slave server, delete master.info and restart the slaver server.
# For that reason, you may want to leave the lines below untouched
# (commented) and instead use CHANGE MASTER TO (see above)
#
# required unique id between 2 and 2^32 - 1
# (and different from the master)
# defaults to 2 if master-host is set
# but will not function as a slave if omitted
#server-id = 2
#
# The replication master for this slave - required
#master-host =
#
# The username the slave will use for authentication when connecting
# to the master - required
#master-user =
#
# The password the slave will authenticate with when connecting to
# the master - required
#master-password =
#
# The port the master is listening on.
# optional - defaults to 3306
#master-port =
#
# binary logging - not required for slaves, but recommended
#log-bin
# Point the following paths to different dedicated disks
#tmpdir = /tmp/
#log-update = /path-to-dedicated-directory/hostname
# Uncomment the following if you are using BDB tables
#bdb_cache_size = 4M
#bdb_max_lock = 10000
# Uncomment the following if you are using InnoDB tables
#innodb_data_home_dir = /var/lib/mysql/
#innodb_data_file_path = ibdata1:10M:autoextend
#innodb_log_group_home_dir = /var/lib/mysql/
#innodb_log_arch_dir = /var/lib/mysql/
# You can set .._buffer_pool_size up to 50 - 80 %
# of RAM but beware of setting memory usage too high
#innodb_buffer_pool_size = 16M
#innodb_additional_mem_pool_size = 2M
# Set .._log_file_size to 25 % of buffer pool size
#innodb_log_file_size = 5M
#innodb_log_buffer_size = 8M
#innodb_flush_log_at_trx_commit = 1
#innodb_lock_wait_timeout = 50
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
#safe-updates
[isamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
[myisamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
補充
優(yōu)化table_cachetable_cache指定表高速緩存的大小。每當MySQL訪(fǎng)問(wèn)一個(gè)表時(shí),如果在表緩沖區中還有空間,該表就被打開(kāi)并放入其中,這樣可以更快地訪(fǎng)問(wèn)表內容。通過(guò)檢查峰值時(shí)間的狀態(tài)值Open_tables和Opened_tables,可以決定是否需要增加table_cache的值。如果你發(fā)現open_tables等于table_cache,并且opened_tables在不斷增長(cháng),那么你就需要增加table_cache的值了(上述狀態(tài)值可以使用SHOW STATUS LIKE ‘Open%tables’獲得)。注意,不能盲目地把table_cache設置成很大的值。如果設置得太高,可能會(huì )造成文件描述符不足,從而造成性能不穩定或者連接失敗。對于有1G內存的機器,推薦值是128-256。
案例1:該案例來(lái)自一個(gè)不是特別繁忙的服務(wù)器table_cache – 512open_tables – 103opened_tables – 1273uptime – 4021421 (measured in seconds)該案例中table_cache似乎設置得太高了。在峰值時(shí)間,打開(kāi)表的數目比table_cache要少得多。
案例2:該案例來(lái)自一臺開(kāi)發(fā)服務(wù)器。table_cache – 64open_tables – 64opened-tables – 431uptime – 1662790 (measured in seconds)雖然open_tables已經(jīng)等于table_cache,但是相對于服務(wù)器運行時(shí)間來(lái)說(shuō),opened_tables的值也非常低。因此,增加table_cache的值應該用處不大。案例3:該案例來(lái)自一個(gè)upderperforming的服務(wù)器table_cache – 64open_tables – 64opened_tables – 22423uptime – 19538該案例中table_cache設置得太低了。雖然運行時(shí)間不到6小時(shí),open_tables達到了最大值,opened_tables的值也非常高。這樣就需要增加table_cache的值。優(yōu)化key_buffer_sizekey_buffer_size指定索引緩沖區的大小,它決定索引處理的速度,尤其是索引讀的速度。通過(guò)檢查狀態(tài)值Key_read_requests和Key_reads,可以知道key_buffer_size設置是否合理。比例key_reads / key_read_requests應該盡可能的低,至少是1:100,1:1000更好(上述狀態(tài)值可以使用SHOW STATUS LIKE ‘key_read%’獲得)。key_buffer_size只對MyISAM表起作用。即使你不使用MyISAM表,但是內部的臨時(shí)磁盤(pán)表是MyISAM表,也要使用該值??梢允褂脵z查狀態(tài)值created_tmp_disk_tables得知詳情。對于1G內存的機器,如果不使用MyISAM表,推薦值是16M(8-64M)。
案例1:健康狀況key_buffer_size – 402649088 (384M)key_read_requests – 597579931key_reads - 56188案例2:警報狀態(tài)key_buffer_size – 16777216 (16M)key_read_requests – 597579931key_reads - 53832731案例1中比例低于1:10000,是健康的情況;案例2中比例達到1:11,警報已經(jīng)拉響。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站