innodb的innodb_buffer_pool_size和MyISAM的key_buffer_size

一. key_buffer_size 對MyISAM表來講很是重要。mysql

若是隻是使用MyISAM表,能夠把它設置爲可用內存的 30-40%。合理的值取決於索引大小、數據量以及負載 -- 記住,MyISAM表會使用操做系統的緩存來緩存數據,所以須要留出部份內存給它們,不少狀況下數據比索引大多了。儘管如此,須要老是檢查是否全部的 key_buffer 都被利用了 -- .MYI 文件只有 1GB,而 key_buffer 卻設置爲 4GB 的狀況是很是少的。這麼作太浪費了。若是你不多使用MyISAM表,那麼也保留低於 16-32MB 的 key_buffer_size 以適應給予磁盤的臨時表索引所需。sql

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 設置的太大了。socket

innodb_buffer_pool_size = 8000M性能

或者spa

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裏面的髒頁數目老是不會很大,有新的髒數據按序插入就不會有大的開銷。

相關文章
相關標籤/搜索