一. key_buffer_size 對MyISAM表來說非常重要。
如果只是使用MyISAM表,可以把它設置為可用內存的 30-40%。合理的值取決於索引大小、數據量以及負載 -- 記住,MyISAM表會使用操作系統的緩存來緩存數據,因此需要留出部分內存給它們,很多情況下數據比索引大多了。盡管如此,需要總是檢查是否所有的 key_buffer 都被利用了 -- .MYI 文件只有 1GB,而 key_buffer 卻設置為 4GB 的情況是非常少的。這么做太浪費了。如果你很少使用MyISAM表,那么也保留低於 16-32MB 的 key_buffer_size 以適應給予磁盤的臨時表索引所需。
key_buffer_size = 2000M
或者
key_buffer_size = 1G
二. innodb_buffer_pool_size 對Innodb表來說非常重要。
Innodb相比MyISAM表對緩沖更為敏感。MyISAM可以在默認的 key_buffer_size 設置下運行的可以,然而Innodb在默認的 innodb_buffer_pool_size 設置下卻跟蝸牛似的。由於Innodb把數據和索引都緩存起來,無需留給操作系統太多的內存,因此如果只需要用Innodb的話則可以設置它高達 70-80% 的可用內存。一些應用於 key_buffer 的規則有 -- 如果你的數據量不大,並且不會暴增,那么無需把 innodb_buffer_pool_size 設置的太大了。
innodb_buffer_pool_size = 8000M
或者
innodb_buffer_pool_size = 15G
其他牛人的解釋
#InnoDB存儲數據字典、內部數據結構的緩沖池,16MB 已經足夠大了。
innodb_additional_mem_pool_size = 16M
#InnoDB用於緩存數據、索引、鎖、插入緩沖、數據字典等
#如果是專用的DB服務器,且以InnoDB引擎為主的場景,通常可設置物理內存的50%
#如果是非專用DB服務器,可以先嘗試設置成內存的1/4,如果有問題再調整
#默認值是8M,非常坑X,這也是導致很多人覺得InnoDB不如MyISAM好用的緣故
innodb_buffer_pool_size = 4G
#InnoDB共享表空間初始化大小,默認是 10MB,也非常坑X,改成 1GB,並且自動擴展
innodb_data_file_path = ibdata1:1G:autoextend
#如果不了解本選項,建議設置為1,能較好保護數據可靠性,對性能有一定影響,但可控
innodb_flush_log_at_trx_commit = 1
#抱 怨Innodb比MyISAM慢 100倍?那么你大概是忘了調整這個值。默認值1的意思是每一次事務提交或事務外的指令都需要把日志寫入(flush)硬盤,這是很費時的。特別是使用電 池供電緩存(Battery backed up cache)時。設成2對於很多運用,特別是從MyISAM表轉過來的是可以的,它的意思是不寫入硬盤而是寫入系統緩存。日志仍然會每秒flush到硬 盤,所以你一般不會丟失超過1-2秒的更新。設成0會更快一點,但安全方面比較差,即使MySQL掛了也可能會丟失事務的數據。而值2只會在整個操作系統 掛了時才可能丟數據
#InnoDB的log buffer,通常設置為 64MB 就足夠了
innodb_log_buffer_size = 64M
#InnoDB redo log大小,通常設置256MB 就足夠了
innodb_log_file_size = 256M
#InnoDB redo log文件組,通常設置為 2 就足夠了
innodb_log_files_in_group = 2
#啟用InnoDB的獨立表空間模式,便於管理
innodb_file_per_table = 1
#啟用InnoDB的status file,便於管理員查看以及監控等
innodb_status_file = 1
#設置事務隔離級別為 READ-COMMITED,提高事務效率,通常都滿足事務一致性要求
transaction_isolation = READ-COMMITTED
[mysqld]
#禁止開啟自動事務
init_connect='SET autocommit=0'
innodb_buffer_pool_size = 4G
key_buffer_size = 1G
user = mysql
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
skip-external-locking
#bind-address = 127.0.0.1
#
# * Fine Tuning
#
key_buffer = 16M
max_allowed_packet = 16M
thread_stack = 192K
thread_cache_size = 8
# This replaces the startup script and checks MyISAM tables if needed
# the first time they are touched
myisam-recover = BACKUP
#max_connections = 100
#table_cache = 64
#thread_concurrency = 10
# * Query Cache Configuration
query_cache_limit = 1M
query_cache_size = 16M
#general_log_file = /var/log/mysql/mysql.log
#general_log = 1
log_error = /var/log/mysql/error.log
# Here you can see queries with especially long duration
log_slow_queries = /var/log/mysql/mysql-slow.log
long_query_time = 0.05
#log-queries-not-using-indexes
expire_logs_days = 10
max_binlog_size = 100M
# * InnoDB
# InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.
# Read the manual for more InnoDB related options. There are many!
# chroot = /var/lib/mysql/
——————————————————————————————————————————————————
innodb_pool_buffer_size對innodb性能的影響
innodb_pool_buffer_size是影響innodb性能最重要的參數,指的是innodb緩沖的大小。一般來說,它越大Innodb的吞吐量(單位: tps)就越高。所以,在不影響服務器上其他程序正常工作的情況下,這個值總是越大越好。
但是當innodb做crash recovery的時候,大的pool buffer會讓recovery奇慢無比。 一種折衷的解決方法就是:啟動的時候用小的pool buffer,恢復完成以后改用大的pool bufer。
為什么小的pool buffer能加快恢復的速度?
用Oprofile跟蹤恢復的過程發現,Flush_List中頁的插入排序耗掉了大多的時間,大的Pool buffer會讓Flush list中的臟頁越來越多,而插入排序的時間復雜度是O(N^2)。 相反,小的pool buffer會讓flush list的臟page及時flush,這樣flush list里面的臟頁數目總是不會很大,有新的臟數據按序插入就不會有大的開銷。