浅谈MYSQL引擎之INNODB引擎

MYSQL 经常使用的引擎主要有一下几种,MRG_MYISAM 、CSV 、MyISAM、InnoDB、MEMORY ,NDB,其中MyISAM、InnoDB是mysql最经常使用的存储引擎,今天主要讨论 InnoDB引擎。mysql



1、什么是InnoDB引擎算法

InnoDB引擎是MYSQL数据库的另外一个重要的额存储引擎,正成为目前MYSQL AB全部发行新版的标准,被包含在全部二进制安装包里。sql

和其余的存储引擎相比,InnoDB引擎的优势支持兼容ACID的事物,以及参数完整性(即对外建的支持)。数据库

MYSQL5.5.5之后数据库的默认存储引擎为InnoDB引擎缓存



2、InnoDB引擎的特色安全

一、支持事物:支持4个事物隔离级别,支持多版本读(ACID :原子性、一致性、隔离性、持久性.)数据结构

二、行级锁定(更新时通常是锁定当前行,InnoDB锁定在行级而且也在SELECT语句提供一个Oracle风格一致的非 锁定读):经过索引实现,全表扫描仍然会是锁表。架构

三、读写阻塞与事物隔离级别有关并发

四、具备很是高效的缓存特性:能缓存索引,也能缓存数据(InnoDB存储引擎为在主内存中缓存数据和索引而维持它本身的缓冲池。 InnoDB存储它的表&索引在一个表空间中,表空间能够包含多个文件(或原始磁盘分区))oracle

五、整个表和主键以Cluster方式存储,组成一颗平衡树

六、全部Secondar Index都会保存主键信息

七、支持分区,表空间,相似oracle数据库

八、支持外键约束,5.5版本之后支持全文索引


3、事务的四大特性(ACID)

一、原子性

事务是一个不可分割的单位,事务中的全部SQL灯操做要么都发生,要么都不发生.

二、一致性

事务发生以前和发生以后,数据的完整性必须保持一致.

三、隔离性

当并发访问数据库时,一个正在执行的事务在执行完毕前,对于其余的会话是不可见的,多个并发事务之间的数据相互隔离的。

四、持久性

一个事务一旦被提交,它对数据库中的数据改变就是永久性的,若是出了错误,事务也不容许撤销,只能经过“补偿性事务”.


4、InnoDB引擎架构

    InnoDB的多个内存块组成了内存池,负责以下工做:

     一、维护全部进程/线程须要访问的多个内部数据结构。


   二、缓存磁盘上的数据,方便快速的读取,而且在对磁盘文件的数据进行修改以前在这里缓存。


   三、重作日志缓存。

 后台线程的主要做用是负责刷新内存池中的数据,保证缓冲池中的内存缓存是最近的数据,此外、将已经修改的数据文件刷 新到磁盘文件


  后台线程

  innodb存储引擎后台有7个线程,—–4个IO线程(insert buffer thread,log thread,read thread,write thread),1个master           thread,一个lock监控线程,一个错误监控线程。


  内存

innodb存储引擎内存由如下三个部分组成:缓冲池(buffer pool),重作日志缓存(redo log buffer),额外的内存池(additional

 memory pool)。可使用 show engine innodb status来查看innodb_buffer_pool的使用状况。

innodb_buffer_pool_size:具体看,缓冲池中的数据库类型有:索引页、数据库页、undo页、插入缓存页(insert buffer)、自适应

hash(adaptive hashindex)、innodb存储的锁信息(lock info)、数据字典信息(data dictionary)。

InnoDB工做方式:将数据文件按页(每页16K)读入InnoDBbuffer pool,而后按最近最少使用算法(LRU)保留缓存数据,最后经过必定频

率将脏页刷新到文件。


、InnoDB引擎适用的生产业务场景


一、须要事务支持的业务(具备较好的食物特性)

二、行级锁定对高并发有很好的适应能力,但须要确保查询是经过索引完成

三、数据更新较为频繁的场景

四、数据一致性要求较高的业务

五、硬件设备内存较大,能够利用InnoDB较好的缓存能力来提升内存利用率,尽量减小磁盘IO


6、INNODB表空间

 

默认表空间文件为ibdata1文件innodb_data_file_path存储数据,innodb_file_per_table能够按表分别产生一个表空间.db文件,但仅存该表的

数据索引和插入缓冲等信息,其余信息如undo信息,系统事务信息,double write buffer等仍是存放在默认表空间(ibdata1或表空间组)里。



7、关键特性,为innodb提升性能的技术

   一、插入缓存

当一个表有非汇集索引时,对于非汇集索引的叶子节点的插入不是顺序的,这时候须要离散的访问非汇集索引页,性能就在这里降 

 低了,这是因为b+树的原理致使的。插入缓存就是用来解决这个问题的。对于非汇集索引的插入和更新操做,不是每一次都直接插入

索引页,而是先判断插入的非汇集索引页是否在缓存中,若是在就直接插入,若是不在就放入到一个插入缓冲区中,好似欺骗数据库

这个非汇集索引已经插入到叶子节点了。而后再以必定的频率插入缓存和非汇集索引页字节点的合并操做。插入缓存的使用须要知足

如下两个条件(也就是非惟一的辅助索引):索引是辅助索引;索引不是惟一的。

  二、两次写

      两次写给innodb带来的是可靠性,主要用来解决部分写失败(partial page write)。在应用重作日以前,咱们须要一个页的副本,当写入失效

     发生时,先经过页的副原本还原该页,再进行重作,这就是doublewrite。

      doublewrite有两部分组成,一部分是内存中的doublewrite buffer,大小为2M,另一部分就是物理磁盘上的共享表空间中联系的128个页,

    即两个区,大小一样为2M。当缓冲池的张也刷新时,并不直接写硬盘,而是回经过memcpy函数将脏页先拷贝到内存中的doublewrite

     buffer,以后经过doublewrite buffer再分两次写,每次写入1M到共享表空间的物理磁盘上,而后立刻调用fsync函数,同步磁盘。

  三、自适应哈西索引

因为innodb不支持hash索引,可是在某些状况下hash索引的效率很高,因而出现了 adaptive hash index功能,innodb存储引擎会监控对表上

索引的查找,若是观察到创建hash索引能够提升性能的时候,则自动创建hash索引

 四、启动、关闭、恢复

      innodb_fast_shutdown影响InnoDB表关闭。该参数有0、一、2三个参数


      0 MySQL关闭时  完成全部的full purge和merge insertbuffer操做


      1 默认值 只将缓冲池内的一些脏页刷新至磁盘


      2 将日志都写入日志文件不会有任何事务丢失但下次启动时会进行recovery

     innodb_force_recovery影响整个innodb存储引擎的恢复情况,该值默认为0,表示当须要恢复时,须要执行全部的恢复操做,当不能进行有      效恢复时,如数据页发生了corruption,mysql数据库可能宕机,并把错误写入错误日志中。





8、InnoDB引擎调优精要

一、主键尽量小,避免给Secondar Index带来过大的空间负担

二、避免全表扫描,由于会使用表级锁

三、尽量缓存全部的索引和数据。,提升响应速度,减小磁盘IO消耗

四、在大批量插入的时候,尽可能本身控制事物而不要使用autocommit自动提交有开关能够控制提交方式

【  取消自动提交事物

  mysql> set global init_connect="set autocommit=0";

  init_connect='SET autocommit=0' // 在mysqld里面加上这些内容  

五、合理设置innodb_flush_log_at_trx_commit参数值,不要过分追求安全性、

  (若是innodb_flush_log_at_trx_commit=0 log buffer 每秒就会被刷写日志文件到磁盘,提交事物的时候不作任何操做)

6避免主键更新,由于这会带来大量的数据移动


9、生产环境中如何批量更改mysql引擎

alter table table_name ENGINE = INNODB


10、InnoDB与MYISAM区别总结

1.InnoDB不支持FULLTEXT类型的索引。 

2.InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,可是MyISAM只要简单的读出保存好的行数便可。注意的是,当count(*)语句包含 where条件时,两种表的操做是同样的。 

在执行数据库写入的操做(insert,update,delete)的时候,mysiam表会锁表,而innodb表会锁行。通俗点说,就是你执行了一个update语句,那么mysiam表会将整个表都锁住,其余的insert和delete、update都会被拒之门外,等到这个update语句执行完成后才会被依次执行

另外,InnoDB表的行锁也不是绝对的,若是在执行一个SQL语句时MySQL不能肯定要扫描的范围,InnoDB表一样会锁全表,例如update table set num=1 where name like “%aaa%” 


3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,可是在MyISAM表中,能够和其余字段一块儿创建联合索引。 

4.DELETE FROM table时,InnoDB不会从新创建表,而是一行一行的删除。 

5.LOAD TABLE FROM MASTER操做对InnoDB是不起做用的,解决方法是首先把InnoDB表改为MyISAM表,导入数据后再改为InnoDB表,可是对于使用的额外的InnoDB特性(例如外键)的表不适用。 


11、InnoDB与MYISAM如何选择

    当你的数据库有大量的写入、更新操做而查询比较少或者数据完整性要求比较高的时候就选择innodb表。当你的数据库主要以查询为主,相比较而言更新和写入比较少,而且业务方面数据完整性要求不那么严格,就选择mysiam表。由于mysiam表的查询操做效率和速度都比innodb要快。

相关文章
相关标签/搜索