欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mysql 優(yōu)化日記

 更新時(shí)間:2009年07月30日 01:04:31   作者:  
mysql 優(yōu)化日記 使用mysql的朋友可以參考下,大家知道如果mysql優(yōu)化與沒優(yōu)化性能會(huì)相差不少呢。
同時(shí)在線訪問量繼續(xù)增大 對于1G內(nèi)存的服務(wù)器明顯感覺到吃力嚴(yán)重時(shí)甚至每天都會(huì)死機(jī) 或者時(shí)不時(shí)的服務(wù)器卡一下 這個(gè)問題曾經(jīng)困擾了我半個(gè)多月MySQL使用是很具伸縮性的算法,因此你通常能用很少的內(nèi)存運(yùn)行或給MySQL更多的被存以得到更好的性能。
安裝好mysql后,配制文件應(yīng)該在/usr/local/mysql/share/mysql目錄中,配制文件有幾個(gè),有my-huge.cnf my-medium.cnf my-large.cnf my-small.cnf,不同的流量的網(wǎng)站和不同配制的服務(wù)器環(huán)境,當(dāng)然需要有不同的配制文件了。
一般的情況下,my-medium.cnf這個(gè)配制文件就能滿足我們的大多需要;一般我們會(huì)把配置文件拷貝到/etc/my.cnf 只需要修改這個(gè)配置文件就可以了,使用mysqladmin variables extended-status –u root –p 可以看到目前的參數(shù),有3個(gè)配置參數(shù)是最重要的,即key_buffer_size,query_cache_size,table_cache。
key_buffer_size只對MyISAM表起作用,
key_buffer_size指定索引緩沖區(qū)的大小,它決定索引處理的速度,尤其是索引讀的速度。一般我們設(shè)為16M,實(shí)際上稍微大一點(diǎn)的站點(diǎn) 這個(gè)數(shù)字是遠(yuǎn)遠(yuǎn)不夠的,通過檢查狀態(tài)值Key_read_requests和Key_reads,可以知道key_buffer_size設(shè)置是否合理。比例key_reads / key_read_requests應(yīng)該盡可能的低,至少是1:100,1:1000更好(上述狀態(tài)值可以使用SHOW STATUS LIKE ‘key_read%'獲得)。 或者如果你裝了phpmyadmin 可以通過服務(wù)器運(yùn)行狀態(tài)看到,筆者推薦用phpmyadmin管理mysql,以下的狀態(tài)值都是本人通過phpmyadmin獲得的實(shí)例分析:
這個(gè)服務(wù)器已經(jīng)運(yùn)行了20天
key_buffer_size – 128M
key_read_requests – 650759289
key_reads - 79112比例接近1:8000 健康狀況非常好
另外一個(gè)估計(jì)key_buffer_size的辦法 把你網(wǎng)站數(shù)據(jù)庫的每個(gè)表的索引所占空間大小加起來看看以此服務(wù)器為例:比較大的幾個(gè)表索引加起來大概125M 這個(gè)數(shù)字會(huì)隨著表變大而變大。
從4.0.1開始,MySQL提供了查詢緩沖機(jī)制。使用查詢緩沖,MySQL將SELECT語句和查詢結(jié)果存放在緩沖區(qū)中,今后對于同樣的SELECT語句(區(qū)分大小寫),將直接從緩沖區(qū)中讀取結(jié)果。根據(jù)MySQL用戶手冊,使用查詢緩沖最多可以達(dá)到238%的效率。
通過調(diào)節(jié)以下幾個(gè)參數(shù)可以知道query_cache_size設(shè)置得是否合理
Qcache inserts
Qcache hits
Qcache lowmem prunes
Qcache free blocks
Qcache total blocksQcache_lowmem_prunes的值非常大,則表明經(jīng)常出現(xiàn)緩沖不夠的情況,同時(shí)Qcache_hits的值非常大,則表明查詢緩沖使用非常頻繁,此時(shí)需要增加緩沖大小Qcache_hits的值不大,則表明你的查詢重復(fù)率很低,這種情況下使用查詢緩沖反而會(huì)影響效率,那么可以考慮不用查詢緩沖。此外,在SELECT語句中加入SQL_NO_CACHE可以明確表示不使用查詢緩沖。
Qcache_free_blocks,如果該值非常大,則表明緩沖區(qū)中碎片很多query_cache_type指定是否使用查詢緩沖
我設(shè)置:
query_cache_size = 32M
query_cache_type= 1得到如下狀態(tài)值:
Qcache queries in cache 12737 表明目前緩存的條數(shù)
Qcache inserts 20649006
Qcache hits 79060095  看來重復(fù)查詢率還挺高的
Qcache lowmem prunes 617913 有這么多次出現(xiàn)緩存過低的情況
Qcache not cached 189896   
Qcache free memory 18573912  目前剩余緩存空間
Qcache free blocks 5328 這個(gè)數(shù)字似乎有點(diǎn)大 碎片不少
Qcache total blocks 30953如果內(nèi)存允許32M應(yīng)該要往上加點(diǎn)
table_cache指定表高速緩存的大小。每當(dāng)MySQL訪問一個(gè)表時(shí),如果在表緩沖區(qū)中還有空間,該表就被打開并放入其中,這樣可以更快地訪問表內(nèi)容。通過檢查峰值時(shí)間的狀態(tài)值Open_tables和Opened_tables,可以決定是否需要增加table_cache的值。如果你發(fā)現(xiàn)open_tables等于table_cache,并且opened_tables在不斷增長,那么你就需要增加table_cache的值了(上述狀態(tài)值可以使用SHOW STATUS LIKE ‘Open%tables'獲得)。注意,不能盲目地把table_cache設(shè)置成很大的值。如果設(shè)置得太高,可能會(huì)造成文件描述符不足,從而造成性能不穩(wěn)定或者連接失敗。
對于有1G內(nèi)存的機(jī)器,推薦值是128-256。
筆者設(shè)置table_cache = 256
得到以下狀態(tài):
Open tables 256
Opened tables 9046雖然open_tables已經(jīng)等于table_cache,但是相對于服務(wù)器運(yùn)行時(shí)間來說,已經(jīng)運(yùn)行了20天,opened_tables的值也非常低。因此,增加table_cache的值應(yīng)該用處不大。如果運(yùn)行了6個(gè)小時(shí)就出現(xiàn)上述值 那就要考慮增大table_cache。
如果你不需要記錄2進(jìn)制log 就把這個(gè)功能關(guān)掉,注意關(guān)掉以后就不能恢復(fù)出問題前的數(shù)據(jù)了,需要您手動(dòng)備份,二進(jìn)制日志包含所有更新數(shù)據(jù)的語句,其目的是在恢復(fù)數(shù)據(jù)庫時(shí)用它來把數(shù)據(jù)盡可能恢復(fù)到最后的狀態(tài)。另外,如果做同步復(fù)制( Replication )的話,也需要使用二進(jìn)制日志傳送修改情況。
log_bin指定日志文件,如果不提供文件名,MySQL將自己產(chǎn)生缺省文件名。MySQL會(huì)在文件名后面自動(dòng)添加數(shù)字引,每次啟動(dòng)服務(wù)時(shí),都會(huì)重新生成一個(gè)新的二進(jìn)制文件。此外,使用log-bin-index可以指定索引文件;使用binlog-do-db可以指定記錄的數(shù)據(jù)庫;使用binlog-ignore-db可以指定不記錄的數(shù)據(jù)庫。注意的是:binlog-do-db和binlog-ignore-db一次只指定一個(gè)數(shù)據(jù)庫,指定多個(gè)數(shù)據(jù)庫需要多個(gè)語句。而且,MySQL會(huì)將所有的數(shù)據(jù)庫名稱改成小寫,在指定數(shù)據(jù)庫時(shí)必須全部使用小寫名字,否則不會(huì)起作用。
關(guān)掉這個(gè)功能只需要在他前面加上#號(hào)
#log-bin開啟慢查詢?nèi)罩? slow query log ) 慢查詢?nèi)罩緦τ诟櫽袉栴}的查詢非常有用。它記錄所有查過long_query_time的查詢,如果需要,還可以記錄不使用索引的記錄。下面是一個(gè)慢查詢?nèi)罩镜睦樱?
開啟慢查詢?nèi)罩?,需要設(shè)置參數(shù)log_slow_queries、long_query_times、log-queries-not-using-indexes。
log_slow_queries指定日志文件,如果不提供文件名,MySQL將自己產(chǎn)生缺省文件名。long_query_times指定慢查詢的閾值,缺省是10秒。log-queries-not-using-indexes是4.1.0以后引入的參數(shù),它指示記錄不使用索引的查詢。筆者設(shè)置long_query_time=10
筆者設(shè)置:
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參數(shù)說明:
back_log
要求MySQL能有的連接數(shù)量。當(dāng)主要MySQL線程在一個(gè)很短時(shí)間內(nèi)得到非常多的連接請求,這就起作用,然后主線程花些時(shí)間(盡管很短)檢查連接并且啟動(dòng)一個(gè)新線程。back_log值指出在MySQL暫時(shí)停止回答新請求之前的短時(shí)間內(nèi)多少個(gè)請求可以被存在堆棧中。只有如果期望在一個(gè)短時(shí)間內(nèi)有很多連接,你需要增加它,換句話說,這值對到來的TCP/IP連接的偵聽隊(duì)列的大小。你的操作系統(tǒng)在這個(gè)隊(duì)列大小上有它自己的限制。 Unix listen(2)系統(tǒng)調(diào)用的手冊頁應(yīng)該有更多的細(xì)節(jié)。檢查你的OS文檔找出這個(gè)變量的最大值。試圖設(shè)定back_log高于你的操作系統(tǒng)的限制將是無效的。
max_connections
并發(fā)連接數(shù)目最大,120 超過這個(gè)值就會(huì)自動(dòng)恢復(fù),出了問題能自動(dòng)解決
thread_cache
沒找到具體說明,不過設(shè)置為32后 20天才創(chuàng)建了400多個(gè)線程 而以前一天就創(chuàng)建了上千個(gè)線程 所以還是有用的
thread_concurrency
#設(shè)置為你的cpu數(shù)目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補(bǔ)充
優(yōu)化table_cachetable_cache指定表高速緩存的大小。每當(dāng)MySQL訪問一個(gè)表時(shí),如果在表緩沖區(qū)中還有空間,該表就被打開并放入其中,這樣可以更快地訪問表內(nèi)容。通過檢查峰值時(shí)間的狀態(tài)值Open_tables和Opened_tables,可以決定是否需要增加table_cache的值。如果你發(fā)現(xiàn)open_tables等于table_cache,并且opened_tables在不斷增長,那么你就需要增加table_cache的值了(上述狀態(tài)值可以使用SHOW STATUS LIKE ‘Open%tables'獲得)。注意,不能盲目地把table_cache設(shè)置成很大的值。如果設(shè)置得太高,可能會(huì)造成文件描述符不足,從而造成性能不穩(wěn)定或者連接失敗。對于有1G內(nèi)存的機(jī)器,推薦值是128-256。
案例1:該案例來自一個(gè)不是特別繁忙的服務(wù)器table_cache – 512open_tables – 103opened_tables – 1273uptime – 4021421 (measured in seconds)該案例中table_cache似乎設(shè)置得太高了。在峰值時(shí)間,打開表的數(shù)目比table_cache要少得多。
案例2:該案例來自一臺(tái)開發(fā)服務(wù)器。table_cache – 64open_tables – 64opened-tables – 431uptime – 1662790 (measured in seconds)雖然open_tables已經(jīng)等于table_cache,但是相對于服務(wù)器運(yùn)行時(shí)間來說,opened_tables的值也非常低。因此,增加table_cache的值應(yīng)該用處不大。案例3:該案例來自一個(gè)upderperforming的服務(wù)器table_cache – 64open_tables – 64opened_tables – 22423uptime – 19538該案例中table_cache設(shè)置得太低了。雖然運(yùn)行時(shí)間不到6小時(shí),open_tables達(dá)到了最大值,opened_tables的值也非常高。這樣就需要增加table_cache的值。優(yōu)化key_buffer_sizekey_buffer_size指定索引緩沖區(qū)的大小,它決定索引處理的速度,尤其是索引讀的速度。通過檢查狀態(tài)值Key_read_requests和Key_reads,可以知道key_buffer_size設(shè)置是否合理。比例key_reads / key_read_requests應(yīng)該盡可能的低,至少是1:100,1:1000更好(上述狀態(tài)值可以使用SHOW STATUS LIKE ‘key_read%'獲得)。key_buffer_size只對MyISAM表起作用。即使你不使用MyISAM表,但是內(nèi)部的臨時(shí)磁盤表是MyISAM表,也要使用該值??梢允褂脵z查狀態(tài)值created_tmp_disk_tables得知詳情。對于1G內(nèi)存的機(jī)器,如果不使用MyISAM表,推薦值是16M(8-64M)。
案例1:健康狀況key_buffer_size – 402649088 (384M)key_read_requests – 597579931key_reads - 56188案例2:警報(bào)狀態(tài)key_buffer_size – 16777216 (16M)key_read_requests – 597579931key_reads - 53832731案例1中比例低于1:10000,是健康的情況;案例2中比例達(dá)到1:11,警報(bào)已經(jīng)拉響。

1)、back_log: 要求 MySQL 能有的連接數(shù)量。當(dāng)主要MySQL線程在一個(gè)很短時(shí)間內(nèi)得到非常多的連接請求,這就起作用,然后主線程花些時(shí)間(盡管很短)檢查連接并且啟動(dòng)一個(gè)新線程。
back_log值指出在MySQL暫時(shí)停止回答新請求之前的短時(shí)間內(nèi)多少個(gè)請求可以被存在堆棧中。只有如果期望在一個(gè)短時(shí)間內(nèi)有很多連接,你需要增加它,換句話說,這值對到來的TCP/IP連接的偵聽隊(duì)列的大小。你的操作系統(tǒng)在這個(gè)隊(duì)列大小上有它自己的限制。 試圖設(shè)定back_log高于你的操作系統(tǒng)的限制將是無效的。 當(dāng)你觀察你的主機(jī)進(jìn)程列表,發(fā)現(xiàn)大量 264084 | unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL 的待連接進(jìn)程時(shí),就要加大 back_log 的值了。默認(rèn)數(shù)值是50,我把它改為500。

(2)、interactive_timeout: 服務(wù)器在關(guān)閉它前在一個(gè)交互連接上等待行動(dòng)的秒數(shù)。一個(gè)交互的客戶被定義為對 mysql_real_connect()使用 CLIENT_INTERACTIVE 選項(xiàng)的客戶。 默認(rèn)數(shù)值是28800,我把它改為7200。

(3)、key_buffer_size: 索引塊是緩沖的并且被所有的線程共享。key_buffer_size是用于索引塊的緩沖區(qū)大小,增加它可得到更好處理的索引(對所有讀和多重寫),到你能負(fù)擔(dān)得起那樣多。如果你使它太大,系統(tǒng)將開始換頁并且真的變慢了。默認(rèn)數(shù)值是8388600(8M),我的MySQL主機(jī)有2GB內(nèi)存,所以我把它改為402649088(400MB)。

(4)、max_connections: 允許的同時(shí)客戶的數(shù)量。增加該值增加 mysqld 要求的文件描述符的數(shù)量。這個(gè)數(shù)字應(yīng)該增加,否則,你將經(jīng)??吹?Too many connections 錯(cuò)誤。 默認(rèn)數(shù)值是100,我把它改為1024 。

(5)、record_buffer: 每個(gè)進(jìn)行一個(gè)順序掃描的線程為其掃描的每張表分配這個(gè)大小的一個(gè)緩沖區(qū)。如果你做很多順序掃描,你可能想要增加該值。默認(rèn)數(shù)值是131072(128K),我把它改為16773120 (16M)

(6)、sort_buffer: 每個(gè)需要進(jìn)行排序的線程分配該大小的一個(gè)緩沖區(qū)。增加這值加速ORDER BY或GROUP BY操作。默認(rèn)數(shù)值是2097144(2M),我把它改為 16777208 (16M)。

(7)、table_cache: 為所有線程打開表的數(shù)量。增加該值能增加mysqld要求的文件描述符的數(shù)量。MySQL對每個(gè)唯一打開的表需要2個(gè)文件描述符。默認(rèn)數(shù)值是64,我把它改為512。

(、thread_cache_size: 可以復(fù)用的保存在中的線程的數(shù)量。如果有,新的線程從緩存中取得,當(dāng)斷開連接的時(shí)候如果有空間,客戶的線置在緩存中。如果有很多新的線程,為了提高性能可以這個(gè)變量值。通過比較 Connections 和 Threads_created 狀態(tài)的變量,可以看到這個(gè)變量的作用。我把它設(shè)置為 80。

(10)、wait_timeout: 服務(wù)器在關(guān)閉它之前在一個(gè)連接上等待行動(dòng)的秒數(shù)。 默認(rèn)數(shù)值是28800,我把它改為7200。 注:參數(shù)的調(diào)整可以通過修改 /etc/my.cnf 文件并重啟 MySQL 實(shí)現(xiàn)。這是一個(gè)比較謹(jǐn)慎的工作,上面的結(jié)果也僅僅是我的一些看法,你可以根據(jù)你自己主機(jī)的硬件情況(特別是內(nèi)存大?。┻M(jìn)一步修改。

我從網(wǎng)上找到的,我剛看了一下,還算不錯(cuò),發(fā)在這里,大家看看,最好有牛人補(bǔ)充完善然后,再整理整理!

========================================在Apache, PHP, MySQL的體系架構(gòu)中,MySQL對于性能的影響最大,也是關(guān)鍵的核心部分。對于Discuz!論壇程序也是如此,MySQL的設(shè)置是否合理優(yōu)化,直接影響到論壇的速度和承載量!同時(shí),MySQL也是優(yōu)化難度最大的一個(gè)部分,不但需要理解一些MySQL專業(yè)知識(shí),同時(shí)還需要長時(shí)間的觀察統(tǒng)計(jì)并且根據(jù)經(jīng)驗(yàn)進(jìn)行判斷,然后設(shè)置合理的參數(shù)。 下面我們了解一下MySQL優(yōu)化的一些基礎(chǔ),MySQL的優(yōu)化我分為兩個(gè)部分,一是服務(wù)器物理硬件的優(yōu)化;二是MySQL自身(my.cnf)的優(yōu)化。

(1) 服務(wù)器硬件對MySQL性能的影響
a) 磁盤尋道能力(磁盤I/O),以目前高轉(zhuǎn)速SCSI硬盤(7200轉(zhuǎn)/秒)為例,這種硬盤理論上每秒尋道7200次,這是物理特性決定的,沒有辦法改變。MySQL每秒鐘都在進(jìn)行大量、復(fù)雜的查詢操作,對磁盤的讀寫量可想而知。所以,通常認(rèn)為磁盤I/O是制約MySQL性能的最大因素之一,對于日均訪問量在100萬PV以上的Discuz!論壇,由于磁盤I/O的制約,MySQL的性能會(huì)非常低下!解決這一制約因素可以考慮以下幾種解決方案: 使用RAID-0+1磁盤陣列,注意不要嘗試使用RAID-5,MySQL在RAID-5磁盤陣列上的效率不會(huì)像你期待的那樣快; 拋棄傳統(tǒng)的硬盤,使用速度更快的閃存式存儲(chǔ)設(shè)備。經(jīng)過Discuz!公司技術(shù)工程的測試,使用閃存式存儲(chǔ)設(shè)備可比傳統(tǒng)硬盤速度高出6-10倍左右。
b) CPU 對于MySQL應(yīng)用,推薦使用S.M.P.架構(gòu)的多路對稱CPU,例如:可以使用兩顆Intel Xeon 3.6GHz的CPU。
c) 物理內(nèi)存對于一臺(tái)使用MySQL的Database Server來說,服務(wù)器內(nèi)存建議不要小于2GB,推薦使用4GB以上的物理內(nèi)存。

(2) MySQL自身因素當(dāng)解決了上述服務(wù)器硬件制約因素后,讓我們看看MySQL自身的優(yōu)化是如何操作的。對MySQL自身的優(yōu)化主要是對其配置文件my.cnf中的各項(xiàng)參數(shù)進(jìn)行優(yōu)化調(diào)整。下面我們介紹一些對性能影響較大的參數(shù)。 由于my.cnf文件的優(yōu)化設(shè)置是與服務(wù)器硬件配置息息相關(guān)的,因而我們指定一個(gè)假想的服務(wù)器硬件環(huán)境:
CPU: 2顆Intel Xeon 2.4GHz 內(nèi)存: 4GB DDR 硬盤: SCSI 73GB
下面,我們根據(jù)以上硬件配置結(jié)合一份已經(jīng)優(yōu)化好的my.cnf進(jìn)行說明:
# vi /etc/my.cnf以下只列出my.cnf文件中[mysqld]段落中的內(nèi)容,其他段落內(nèi)容對MySQL運(yùn)行性能影響甚微,因而姑且忽略。
[mysqld]
port = 3306
serverid = 1
socket = /tmp/mysql.sock
skip-locking
# 避免MySQL的外部鎖定,減少出錯(cuò)幾率增強(qiáng)穩(wěn)定性。
skip-name-resolve禁止MySQL對外部連接進(jìn)行DNS解析,使用這一選項(xiàng)可以消除MySQL進(jìn)行DNS解析的時(shí)間。但需要注意,如果開啟該選項(xiàng),則所有遠(yuǎn)程主機(jī)連接授權(quán)都要使用IP地址方式,否則MySQL將無法正常處理連接請求!



back_log = 384指定MySQL可能的連接數(shù)量。當(dāng)MySQL主線程在很短的時(shí)間內(nèi)接收到非常多的連接請求,該參數(shù)生效,主線程花費(fèi)很短的時(shí)間檢查連接并且啟動(dòng)一個(gè)新線程。
back_log參數(shù)的值指出在MySQL暫時(shí)停止響應(yīng)新請求之前的短時(shí)間內(nèi)多少個(gè)請求可以被存在堆棧中。 如果系統(tǒng)在一個(gè)短時(shí)間內(nèi)有很多連接,則需要增大該參數(shù)的值,該參數(shù)值指定到來的TCP/IP連接的偵聽隊(duì)列的大小。不同的操作系統(tǒng)在這個(gè)隊(duì)列大小上有它自己的限制。 試圖設(shè)定back_log高于你的操作系統(tǒng)的限制將是無效的。默認(rèn)值為50。對于Linux系統(tǒng)推薦設(shè)置為小于512的整數(shù)。


key_buffer_size = 256M
# key_buffer_size指定用于索引的緩沖區(qū)大小,增加它可得到更好的索引處理性能。對于內(nèi)存在4GB左右的服務(wù)器該參數(shù)可設(shè)置為256M或384M。注意:該參數(shù)值設(shè)置的過大反而會(huì)是服務(wù)器整體效率降低!
max_allowed_packet = 4M
thread_stack = 256K
table_cache = 128K
sort_buffer_size = 6M查詢排序時(shí)所能使用的緩沖區(qū)大小。注意:該參數(shù)對應(yīng)的分配內(nèi)存是每連接獨(dú)占!如果有100個(gè)連接,那么實(shí)際分配的總共排序緩沖區(qū)大小為100 × 6 = 600MB。所以,對于內(nèi)存在4GB左右的服務(wù)器推薦設(shè)置為6-8M。


read_buffer_size = 4M讀查詢操作所能使用的緩沖區(qū)大小。和sort_buffer_size一樣,該參數(shù)對應(yīng)的分配內(nèi)存也是每連接獨(dú)享!


join_buffer_size = 8M聯(lián)合查詢操作所能使用的緩沖區(qū)大小,和sort_buffer_size一樣,該參數(shù)對應(yīng)的分配內(nèi)存也是每連接獨(dú)享!


myisam_sort_buffer_size = 64M
table_cache = 512
thread_cache_size = 64
query_cache_size = 64M指定MySQL查詢緩沖區(qū)的大小。可以通過在MySQL控制臺(tái)執(zhí)行以下命令觀察:
# > SHOW VARIABLES LIKE ‘%query_cache%';
# > SHOW STATUS LIKE ‘Qcache%';
# 如果Qcache_lowmem_prunes的值非常大,則表明經(jīng)常出現(xiàn)緩沖不夠的情況;如果Qcache_hits的值非常大,則表明查詢緩沖使用非常頻繁,如果該值較小反而會(huì)影響效率,那么可以考慮不用查詢緩沖;Qcache_free_blocks,如果該值非常大,則表明緩沖區(qū)中碎片很多。


tmp_table_size = 256M
max_connections = 768指定MySQL允許的最大連接進(jìn)程數(shù)。如果在訪問論壇時(shí)經(jīng)常出現(xiàn)Too Many Connections的錯(cuò)誤提 示,則需要增大該參數(shù)值。


max_connect_errors = 10000000
wait_timeout = 10指定一個(gè)請求的最大連接時(shí)間,對于4GB左右內(nèi)存的服務(wù)器可以設(shè)置為5-10。


thread_concurrency = 8該參數(shù)取值為服務(wù)器邏輯CPU數(shù)量×2,在本例中,服務(wù)器有2顆物理CPU,而每顆物理CPU又支持H.T超線程,所以實(shí)際取值為4 × 2 = 8


skip-networking開啟該選項(xiàng)可以徹底關(guān)閉MySQL的TCP/IP連接方式,如果WEB服務(wù)器是以遠(yuǎn)程連接的方式訪問MySQL數(shù)據(jù)庫服務(wù)器則不要開啟該選項(xiàng)!否則將無法正常連接!

————————————————————————————————–
my.ini配置建議:

table_cache=1024
物理內(nèi)存越大,設(shè)置就越大.默認(rèn)為2402,調(diào)到512-1024最佳

innodb_additional_mem_pool_size=4M
默認(rèn)為2M

innodb_flush_log_at_trx_commit=1
(設(shè)置為0就是等到innodb_log_buffer_size列隊(duì)滿后再統(tǒng)一儲(chǔ)存,默認(rèn)為1)

innodb_log_buffer_size=2M
默認(rèn)為1M

innodb_thread_concurrency=8
你的服務(wù)器CPU有幾個(gè)就設(shè)置為幾,建議用默認(rèn)一般為8

key_buffer_size=256M
默認(rèn)為218 調(diào)到128最佳

tmp_table_size=64M
默認(rèn)為16M 調(diào)到64-256最掛

read_buffer_size=4M
默認(rèn)為64K

read_rnd_buffer_size=16M
默認(rèn)為256K

sort_buffer_size=32M
默認(rèn)為256K

max_connections=1024
默認(rèn)為1210

thread_cache_size=120
默認(rèn)為60

query_cache_size=32M


————————————————————————————————–

以下是另一個(gè)的my.ini配置建議:

port=3306
default-character-set=latin1
default-storage-engine=INNODB
sql-mode=”STRICT_TRANS_TABLES,NO_AUTO_Create_USER,NO_ENGINE_SUBSTITUTION”

max_connections=120
query_cache_size=32M

#緩存數(shù)據(jù)表數(shù)量,設(shè)置這個(gè)參數(shù)可以參見系統(tǒng)狀態(tài)中的 open_tables(表示當(dāng)前打開的數(shù)據(jù)表總數(shù)) 和 opened_tables(表示所有打開的數(shù)據(jù)表總數(shù))
table_cache=256

#臨時(shí)表的大小
tmp_table_size=12M

#緩存可重用的線程數(shù)
thread_cache_size = 64

myisam_max_sort_file_size=100G
myisam_max_extra_sort_file_size=100G
myisam_sort_buffer_size=64M

#這對MyISAM表來說非常重要。如果只是使用MyISAM表,可以把它設(shè)置為可用內(nèi)存的 30-40%。合理的值取決于索引大小、數(shù)據(jù)量以及負(fù)載 — #記住,MyISAM表會(huì)使用操作系統(tǒng)的緩存來緩存數(shù)據(jù),因此需要留出部分內(nèi)存給它們,很多情況下數(shù)據(jù)比索引大多了。
key_buffer_size=128M

read_buffer_size=1M
read_rnd_buffer_size=512K
sort_buffer_size=1M

#這對innodb表來說非常重要
innodb_buffer_pool_size = 256M

#這取決于你需要的回復(fù)速度.128M這個(gè)數(shù)值是適當(dāng)?shù)幕謴?fù)時(shí)間和良好性能之間的一個(gè)好的平衡.
innodb_log_file_size = 128M

#大多數(shù)情況4M足夠,除非正將很大的blob數(shù)據(jù)導(dǎo)入到Innodb中可以增加一點(diǎn).
innodb_log_buffer_size=4M

#這個(gè)值取決于你的程序,可能高或者低.8是代表起始值.
innodb_thread_concurrency=8

innodb_additional_mem_pool_size=100M

#如果你不是很關(guān)心ACID,可以容許在系統(tǒng)完全crash的情況下丟失最后一兩秒的事務(wù),那么可以設(shè)置這個(gè)值.它可以極大的提高”短”的寫事務(wù)的效率.
innodb_flush_log_at_trx_commit=2


注意:
很多情況需要具體情況具體分析
1>如果Key_reads太大,則應(yīng)該把my.cnf中Key_buffer_size變大,保持Key_reads/Key_read_requests至少1/100以上,越小越好。
2>如果Qcache_lowmem_prunes很大,就要增加Query_cache_size的值。

相關(guān)文章

  • MySQL在哪些情況下不使用索引的示例

    MySQL在哪些情況下不使用索引的示例

    盡管索引可以顯著提高數(shù)據(jù)庫的查詢性能,但在某些情況下,MySQL可能不會(huì)使用索引,本文就來介紹一下MySQL在哪些情況下不使用索引,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • 20分鐘MySQL基礎(chǔ)入門

    20分鐘MySQL基礎(chǔ)入門

    這篇文章主要為大家分享了20分鐘MySQL基礎(chǔ)入門教程,快速掌握MySQL基礎(chǔ)知識(shí),真正了解MySQL,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • 淺談MySQL中授權(quán)(grant)和撤銷授權(quán)(revoke)用法詳解

    淺談MySQL中授權(quán)(grant)和撤銷授權(quán)(revoke)用法詳解

    下面小編就為大家?guī)硪黄獪\談MySQL中授權(quán)(grant)和撤銷授權(quán)(revoke)用法詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-09-09
  • mysql如何設(shè)置主從數(shù)據(jù)庫的同步

    mysql如何設(shè)置主從數(shù)據(jù)庫的同步

    這篇文章主要介紹了mysql如何設(shè)置主從數(shù)據(jù)庫的同步問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • 如何進(jìn)行mysql的優(yōu)化

    如何進(jìn)行mysql的優(yōu)化

    這篇文章主要介紹了如何進(jìn)行mysql的優(yōu)化,其實(shí)腳本之家之前就分享了很多的相關(guān)資料,需要的朋友可以參考下
    2016-04-04
  • MySQL的使用中實(shí)現(xiàn)讀寫分離的教程

    MySQL的使用中實(shí)現(xiàn)讀寫分離的教程

    這篇文章主要介紹了MySQL的使用中實(shí)現(xiàn)讀寫分離的教程,文中分別介紹了mysql-proxy與mysqlnd_ms的使用,需要的朋友可以參考下
    2015-12-12
  • MySQL前綴索引導(dǎo)致的慢查詢分析總結(jié)

    MySQL前綴索引導(dǎo)致的慢查詢分析總結(jié)

    前綴索引,并不是一個(gè)萬能藥,他的確可以幫助我們對一個(gè)寫過長的字段上建立索引。但也會(huì)導(dǎo)致排序(order by ,group by)查詢上都是無法使用前綴索引的
    2013-05-05
  • 一文搞懂MySQL索引所有知識(shí)點(diǎn)

    一文搞懂MySQL索引所有知識(shí)點(diǎn)

    這篇文章主要帶你搞懂MySQL索引的所有知識(shí)點(diǎn),我們通常所說的索引,包括聚焦索引、覆蓋索引、組合索引、前綴索引、唯一索引等,沒有特別說明,默認(rèn)都是使用B+樹結(jié)構(gòu)組織,感興趣的小伙伴可以參考閱讀
    2023-03-03
  • 基于Redo Log和Undo Log的MySQL崩潰恢復(fù)解析

    基于Redo Log和Undo Log的MySQL崩潰恢復(fù)解析

    這篇文章主要介紹了基于Redo Log和Undo Log的MySQL崩潰恢復(fù)流程,點(diǎn)進(jìn)來的小伙伴不要錯(cuò)過奧
    2021-08-08
  • MySQL學(xué)習(xí)之?dāng)?shù)據(jù)庫操作DML詳解小白篇

    MySQL學(xué)習(xí)之?dāng)?shù)據(jù)庫操作DML詳解小白篇

    本篇文章非常適合MySQl初學(xué)者,主要為大家講解了MySQL數(shù)據(jù)庫的常用操作,有需要的朋友可以借鑒參考下,希望可以有所幫助,祝大家早日進(jìn)步升職加薪
    2021-09-09

最新評(píng)論