Innodb关键特性:插入缓冲,两次写,自适应哈希索引. ->性能 与可靠性.
二次写
由二部分组成,一部分由内存中的doublewrite buffer大小为2MB,另一个部分是物理磁盘上共享表空间中连续的128个页,即二个区extent,即也是2MB. 当缓冲池的脏页刷新时,并不直接写磁盘,通过memcpy函数将脏页拷到内存中的doublewrite buffer中,再通过它分二次,每次写1MB到共享空间表的物理磁盘上. 在完成doublewrite页的写入后再将doublewrite页写入各个表空间中.
show global status like 'innodb_dblwr%'\G;
在ZFS这样的提供写失效的防范机制的文件系统不需要开启二次写功能.
Master主服务器,要确保 开启.
,
自适应哈希
哈希是非常快的查找方法,一般情况时间复杂度为O(1).常用于连接查询,SqlServer ,Oracle的哈希连接hash join.但它们并不支持哈希索引.Mysql Heap引擎的默认索引类型为哈希.而Innodb提供另一种实现:自适应哈希.启用后,读取写入速度提高2倍,对于辅助索引的连接操作,性能可提高5倍.其设计思想是自优化,不需要DBA调整.
innodb_adaptive_hash_index来禁用或者启动此特性.默认为开启
INNODB与MySQL一样,GNU GPLv2下发布;
InnoDB有多个内存块,可认为这些内存块组成了大的内存池,完成如下工作:
1.维护所有进程/线程需要访问的多个内部数据结构;
2.缓存磁盘上数据,方便快速读取;
3.重做日志缓冲。
后台线程主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据,将已修改的数据文件刷新到磁盘文件。
默认情况下,InnoDB存储引擎有7个后台线程。4个IO,1个master,一个锁监控,一个错误监控。IO线程的数量由配置文件中innodb_file_io_threads参数控制,默认4
show engine innodb status\G;
InnoDB
FROM:http://dev.mysql.com/doc/refman/5.1/zh/storage-engines.html#innodb-configuration
InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB存储它的表&索引在一个表空间中,表空间可以包含数个文件(或原始磁盘分区)。
InnoDB 表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上。
在InnoDB上存储超过1TB的数据,还有一些其它站点在InnoDB上处理平均每秒800次插入/更新的负荷。
InnoDB存储引擎管理的两个重要的基于磁盘的资源是InnoDB表空间数据文件和它的日志文件。
如无InnoDB配置选项,MySQL将在MySQL数据目录下创建一个名为ibdata1的10MB大小的自动扩展数据文件,以及两个名为ib_logfile0和ib_logfile1的5MB大小的日志文件。
明确创建的具有相同特征的表空间作为默认设置的设置操作如下:
[mysqld]
innodb_data_file_path=ibdata1:10M:autoextend
这个设置配置一个可扩展大小的尺寸为10MB的单独文件,名为ibdata1。没有给出文件的位置,所以默认的是在MySQL的数据目录内。
尺寸大小用M或者G后缀来指定说明单位是MB或者GB。
一个表空间,它在数据目录里包含一个名为ibdata1的固定尺寸50MB的数据文件和一个名为ibdata2大小为50MB的自动扩展文件,其可以 像这样被配置:
[mysqld]
innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend
指定最大大小
[mysqld]
innodb_data_file_path=ibdata1:10M:autoextend:max:500M
指定目录
InnoDB默认地在MySQL数据目录创建表空间文件。要明确指定一个位置,请使用innodb_data_home_dir选项。比如,要使用两个名为ibdata1和ibdata2的文件,但是要把他们创建到/ibdata, 像如下一样配置InnoDB:
[mysqld]
innodb_data_home_dir = /ibdata
innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend
注释:InnoDB不创建目录,所以在启动服务器之前请确认/ibdata目录的确存在。
[mysqld]
# You can write your other MySQL server options here
innodb_data_home_dir =
# You can write your other MySQL server options here
# ...
# Data files must be able to hold your data and indexes.
# Make sure that you have enough free disk space.
innodb_data_file_path = ibdata1:10M:autoextend
#innodb_data_file_path = /ibdata/ibdata1:2000M;/dr2/ibdata/ibdata2:2000M:autoextend
#
# Set buffer pool size to 50-80% of your computer's memory,
# but make sure on Linux x86 total memory usage is < 2GB
innodb_buffer_pool_size=1G
innodb_additional_mem_pool_size=20M
innodb_log_group_home_dir = /dr3/iblogs
#
innodb_log_files_in_group = 2
#
# Set the log file size to about 25% of the buffer pool size
innodb_log_file_size=250M
innodb_log_buffer_size=8M
#
innodb_flush_log_at_trx_commit=1
innodb_lock_wait_timeout=50
#
# Uncomment the next lines if you want to use them
#innodb_thread_concurrency=5
#
# Set buffer pool size to 50-80% of your computer's memory
#set-variable = innodb_buffer_pool_size=70M
#set-variable = innodb_additional_mem_pool_size=10M
#
# Set the log file size to about 25% of the buffer pool size
#set-variable = innodb_log_file_size=20M
#set-variable = innodb_log_buffer_size=8M
所有数据不被放置在同一物理磁盘上,这样将改善数据库的性能。把日志文件放在与数据文件不同的磁盘上对性能是经常很有好处的。
在32位GNU/Linux x86上,你必须要小心不要设置过高的内存用量。glibc可能允许进程堆积在线程堆栈上发展,它会造成你的服务器崩溃。如果下列表达式的值接近或者超过2GB,系统会面临危机:
innodb_buffer_pool_size+ key_buffer_size+ max_connections*(sort_buffer_size+read_buffer_size+binlog_cache_size)+ max_connections*2MB
每个线程使用一个堆栈(通常是2MB,但在MySQL AB二进制分发版里只有256KB)并且在最坏的情况下也使用sort_buffer_size + read_buffer_size附加内存。
你可以自己编译MySQL,在32位Windows上使用高达64GB物理内存。 “InnoDB启动选项”里对innodb_buffer_pool_awe_mem_mb的描述。
如何调整其它mysqld服务器参数[典型]
[mysqld]
skip-external-locking
max_connections=200
read_buffer_size=1M
sort_buffer_size=1M
#
# Set key_buffer to 5 - 50% of your RAM depending on how much you use MyISAM tables, but keep key_buffer_size + InnoDB buffer pool size < 80% of your RAM
key_buffer_size=value