標籤:innodb
查看mysql慢查詢日誌,發現有很多update慢查詢記錄
# Query_time: 151 Lock_time:0 Rows_sent: 0 Rows_examined:0
update table set ...... where id= 1;
資料庫配置
innodb_buffer_pool_size
如果用Innodb,那麼這是一個重要變數。相對於MyISAM來說,Innodb對於buffersize更敏感。MySIAM可能對於大資料量使用預設的key_buffer_size也還好,但Innodb在大資料量時用預設值就感覺在爬了。Innodb的緩衝池會快取資料和索引,所以不需要給系統的緩衝留空間,如果只用Innodb,可以把這個值設為記憶體的70%-80%。和key_buffer相同,如果資料量比較小也不怎麼增加,那麼不要把這個值設太高也可以提高記憶體的使用率。
innodb_additional_pool_size
這個的效果不是很明顯,至少是當作業系統能合理分配記憶體時。但你可能仍需要設成20M或更多一點以看Innodb會分配多少記憶體做其他用途。
innodb_log_file_size
對於寫很多尤其是大資料量時非常重要。要注意,大的檔案提供更高的效能,但資料庫恢複時會用更多的時間。我一般用64M-512M,具體取決於伺服器的空間。
innodb_log_buffer_size
預設值對於多數中等寫操作和事務短的運用都是可以的。如果經常做更新或者使用了很多blob資料,應該增大這個值。但太大了也是浪費記憶體,因為1秒鐘總會flush(這個詞的中文怎麼說呢?)一次,所以不需要設到超過1秒的需求。8M-16M一般應該夠了。小的運用可以設更小一點。
innodb_flush_log_at_trx_commit (這個很管用)
抱怨Innodb比MyISAM慢100倍?那麼你大概是忘了調整這個值。預設值1的意思是每一次事務提交或事務外的指令都需要把日誌寫入(flush)硬碟,這是很費時的。特別是使用電池供電緩衝(Batterybacked upcache)時。設成2對於很多運用,特別是從MyISAM錶轉過來的是可以的,它的意思是不寫入硬碟而是寫入系統緩衝。日誌仍然會每秒flush到硬碟,所以你一般不會丟失超過1-2秒的更新。設成0會更快一點,但安全方面比較差,即使MySQL掛了也可能會丟失事務的資料。而值2隻會在整個作業系統掛了時才可能丟資料。
更改mysql配置如下:
# Uncomment the following if you are using InnoDB tables
#innodb_data_home_dir = /var/lib/mysql/
innodb_data_file_path = ibdata1:50M: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 = 256M
innodb_additional_mem_pool_size = 10M
# Set .._log_file_size to 25 % of buffer pool size
#innodb_log_file_size = 128M
innodb_log_buffer_size = 8M
#innodb_flush_log_at_trx_commit = 1
#innodb_lock_wait_timeout = 50
innodb_support_xa=off
mysql innodb 配置