程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> MySQL MyISAM 優化設置點滴

MySQL MyISAM 優化設置點滴

編輯:關於MYSQL數據庫

最近在配置mysql服務器需要用到的一些設置,經過測試發現比較不錯的配置方案,亮點在最後啊

先說一點問題:
 
Mysql中的InnoDB和MyISAM是在使用MySQL中最常用的兩個表類型,各有優缺點.兩種類型最主要的差別就是 InnoDB 支持事務處理與外鍵和行級鎖.而MyISAM不支持.所以Myisam往往就容易被人認為只適合在小項目中使用。但是從數據庫需求角度講,要求99.9%的穩定性,方便的擴展性和高可用性來說的話,那MyISAM絕對應該是首選。MyISAM類型的表強調的是性能,其執行數度比InnoDB類型更快, 只是不提供事務支持.大部分項目是讀多寫少的項目,而Myisam的讀性能是比innodb強不少的.
 
優化設置:

key_buffer_size – 這對MyISAM表來說非常重要。如果只是使用MyISAM表,可以把它設置為可用內存的 30-40%。但是注意,分多少內存應該是根據需求決 定,而不是不管什麼機器,都砍掉一半內存用作 key_buffer_size .合理的值取決於索引大小、數據量以及負載 — 記住,MyISAM表會使用操作系統的緩存來緩存數據,因此需要留出部分內存給它們,很多情況下數據比索引大多了。可以通過SHOW GLOBAL STATUS 時的 Key_blocks_unused來查看,只要還有剩余,就說明 key_buffer_size 沒用滿。如果你很少使用MyISAM表,那麼也保留低於 16-32MB 的 key_buffer_size 以適應給予磁盤的臨時表索引所需。
 
query_cache — 如果你的應用程序有大量讀,而且沒有應用程序級別的緩存,那麼這很有用。不要把它設置太大了,因為想要維護它也需要不少開銷,這會導致MySQL變慢。通 常設置為 32-512Mb。設置完之後最好是跟蹤一段時間,查看是否運行良好。在一定的負載壓力下,如果緩存命中率太低了,就啟用它。

sort_buffer_size –如果你只有一些簡單的查詢,那麼就無需增加它的值了,盡管你有 64GB 的內存。搞不好也許會降低性能。
 
query_cache_size -查詢緩沖常被用來緩沖 SELECT 的結果並且在下一次同樣查詢的時候不再執行直接返回結果.打開查詢緩沖可以極大的提高服務器速度, 如果你有大量的相同的查詢並且很少修改表.查看 “Qcache_lowmem_prunes” 狀態變量來檢查是否當前值對於你的負載來說是否足夠高.注意: 在你表經常變化的情況下或者如果你的查詢原文每次都不同,查詢緩沖也許引起性能下降而不是性能提升.注意:設置query_cache_limit,只有小於此設定值的結果才會被緩沖, 此設置用來保護查詢緩沖,防止一個極大的結果集將其他所有的查詢結果都覆蓋.
 
bulk_insert_buffer_size -MyISAM 使用特殊的類似樹的cache來使得突發插入, (這些插入是,INSERT … SELECT, INSERT … VALUES (…), (…), …, 以及 LOAD DATA INFILE) 更快. 此變量限制每個進程中緩沖樹的字節數. 設置為 0 會關閉此優化.為了最優化不要將此值設置大於 “key_buffer_size”.當突發插入被檢測到時此緩沖將被分配.
 
read_rnd_buffer_size -當在排序之後,從一個已經排序好的序列中讀取行時,行數據將從這個緩沖中讀取來防止磁盤尋道.如果你增高此值,可以提高很多ORDER BY的性能.當需要時由每個線程分配
 
thread_cache_size - 我們在cache中保留多少線程用於重用,當一個客戶端斷開連接後,如果cache中的線程還少於thread_cache_size,則客戶端線程被放入cache中.這可以在你需要大量新連接的時候極大的減少線程創建的開銷
 
附錄:適用於日IP 50-100w,PV 100-300w的站點,針對Dell R710,雙至強E5620、16G內存的硬件配置。CentOS 5.6 64位系統,MySQL 5.5.x 穩定版的部分數據庫配置文件,供大家參考

復制代碼 代碼如下:
back_log = 300
max_connections = 3000
max_connect_errors = 30
table_cache = 4096
max_allowed_packet = 32M
#external-locking
#skip-networking
binlog_cache_size = 4M
max_heap_table_size = 128M
sort_buffer_size = 16M
join_buffer_size = 16M
thread_cache_size = 16
thread_concurrency = 8
query_cache_size = 128M
ft_min_word_len = 8
#memlock
thread_stack = 512K
transaction_isolation = REPEATABLE-READ
tmp_table_size = 128M
#log_slave_updates
#log
#log_warnings
log_slow_queries
long_query_time = 6
log_long_format
................

優化配置:經過測試

1.服務器的運行環境
 硬件服務器:Dell R710,雙至強E5620 CPU、16G內存、6*500G硬盤
 操作系統:CentOS5.5 X86_64 系統
Mysql版本:MySQL 5.5.32
適用於:日IP 100-200W ,日PV 200-500W 的站點
2.具體優化配置如下
復制代碼 代碼如下:
[client]
port    = 3306
socket    = /tmp/mysql.sock
default-character-set = utf8 #設置客戶端的字符編碼
[mysqld]
# generic configuration options
port    = 3306
socket    = /tmp/mysql.sock
#*** char set ***
character-set-server = utf8 #設置服務器端的字符編碼
            
#*** network ***
back_log = 512
#skip-networking #默認沒有開啟
max_connections = 3000
max_connect_errors = 30
table_open_cache = 4096
#external-locking #默認沒有開啟
max_allowed_packet = 32M
max_heap_table_size = 128M
            
# *** global cache ***
read_buffer_size = 8M
read_rnd_buffer_size = 64M
sort_buffer_size = 16M
join_buffer_size = 16M
            
# *** thread ***
thread_cache_size = 16
thread_concurrency = 8
thread_stack = 512K
            
# *** query cache ***
query_cache_size = 128M
query_cache_limit = 4M
            
# *** index ***
ft_min_word_len = 8
            
#memlock #默認沒有開啟
default-storage-engine = INNODB
transaction_isolation = REPEATABLE-READ
            
# *** tmp table ***
tmp_table_size = 64M
            
# *** bin log ***
log-bin=mysql-bin
binlog_cache_size = 4M
binlog_format=mixed
#log_slave_updates #默認沒有開啟
#log #默認沒有開啟,此處是查詢日志,開啟會影響服務器性能
log_warnings #開啟警告日志
            
# *** slow query log ***
slow_query_log
long_query_time = 10
# *** Replication related settings
server-id = 1
#server-id = 2
#master-host = <hostname>
#master-user = <username>
#master-password = <password>
#master-port = <port>
#read_only
#*** MyISAM Specific options
key_buffer_size = 128M
bulk_insert_buffer_size = 256M
myisam_sort_buffer_size = 256M
myisam_max_sort_file_size = 10G
myisam_repair_threads = 1
myisam_recover
            
# *** INNODB Specific options ***
#skip-innodb #默認沒有開啟
innodb_additional_mem_pool_size = 64M
innodb_buffer_pool_size = 6G #注意在32位系統上你每個進程可能被限制在 2-3.5G 用戶層面內存限制, 所以不要設置的太高.
innodb_data_file_path = ibdata1:10M:autoextend
#innodb_data_home_dir = <directory>
innodb_write_io_threads = 8
innodb_read_io_threads = 8
#innodb_force_recovery=1
innodb_thread_concurrency = 16
innodb_flush_log_at_trx_commit = 2
#說明:innodb_flush_log_at_trx_commit = 2 如果是游戲服務器,建議此值設置為2;如果是對數據安全要求極高的應用,建議設置為1;設置為0性能最高,但如果發生故障,數據可能會有丟失的危險!默認值1的意思是每一次事務提交或事務外的指令都需要把日志寫入(flush)硬盤,這是很費時的。特別是使用電池供電緩存(Battery backed up cache)時。設成2對於很多運用,特別是從MyISAM表轉過來的是可以的,它的意思是不寫入硬盤而是寫入系統緩存。日志仍然會每秒flush到硬盤,所以你一般不會丟失超過1-2秒的更新。設成0會更快一點,但安全方面比較差,即使MySQL掛了也可能會丟失事務的數據。而值2只會在整個操作系統掛了時才可能丟數據。
#innodb_fast_shutdown
innodb_log_buffer_size = 16M
innodb_log_file_size = 512M
innodb_log_files_in_group = 3
#innodb_log_group_home_dir
innodb_max_dirty_pages_pct = 90
#innodb_flush_method=O_DSYNC
innodb_lock_wait_timeout = 120
[mysqldump]
quick
max_allowed_packet = 32M
[mysql]
no-auto-rehash
[myisamchk]
key_buffer_size = 2048M
sort_buffer_size = 2048M
read_buffer = 32M
write_buffer = 32M
[mysqlhotcopy]
interactive-timeout
[mysqld_safe]
open-files-limit = 10240

好了,上面就是MySQL MyISAM 優化設置的一些個人經驗,感謝這些人的分享。希望大家以後多多支持。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved