高性能Mysql-存储引擎(InnoDB)

MySQL将每个数据库(也可以称为schema)保存为数据目录下的一个子目录,创建表时,MySQL会在数据库子目录下创建一个和表同名的 .frm文件保存表的定义。(也因此MySQL数据库和表的定义对大小写的敏感性与具体平台密切相关)


今天考完网易的数据库管理员笔试,其中一道问答题就说到了InnoDB的特性,OK,我虽然看过这节,但是答的一趟糊涂。再把这个博文改一改。
InnoDB三大性质参考http://www.2cto.com/database/201306/219331.html


一、InnoDB

InnoDB是MySQL的默认事务型引擎,也是最重要,使用最广泛的存储引擎。他是用来处理大量的短期事务,短期事务大部分情况是正常提交的,很少会被回滚。
InnoDB的性能和自动崩溃恢复特性,使得它在非事务型的需求中也很流行。

InnoDB的历史:
2008年发布InnoDB plugin,适用于MySQL 5.1 版本,但当时MySQL默认还是使用旧的InnoDB引擎。在Oracle收购Sun后发布的MySQL5.5中才彻底使用InnoDB plugin替代了旧版本的InnoDB

这个新版本支持一些新特性,例如利用排序创建索引、删除或者增加索引时不需要复制全表数据、新的支持压缩的存储格式,新的大型列值如BLOB的存储方式,以及文件格式管理等。

  1. InnoDB的数据存储在表空间中,表空间是由InnoDB管理的一个黑盒子,由一系列的数据文件组成,4.1版本之后,可以将每个表的数据和索引存放在单独的文件中。

  2. 采用MVCC来支持高并发,并且实现4个标准的隔离级别,默认级别是REPEATABLE READ(可重复读),并且通过间隙锁策略防止幻读的出现。

  3. InnoDB表示基于聚族索引建立的,聚族索引对主键查询有很高的性能,若表上的索引较多的话,主键应当尽可能的小。

  4. InnoDB内部做了很多优化,包括从磁盘读取数据时采用的可预测性预读,能够自动在内存中创建hash索引以加速读操作的自适应哈希索引。

三大特性:

1. 插入缓冲(insert buffer)
对于非聚集索引的插入和更新,不是每一次直接插入索引页中,而是首先判断插入的非聚集索引页是否在缓冲池中,如果在,则直接插入,否则,先放入一个插入缓冲区中。好似欺骗数据库这个非聚集的索引已经插入到叶子节点了,然后再以一定的频率执行插入缓冲和非聚集索引页子节点的合并。
大大提高了对非聚集索引执行插入和修改操作的性能。

2. 两次写(double write)
如果说插入缓冲是为了提高写性能的话,那么两次写是为了提高可靠性,牺牲了一点点写性能。

部分写失效
当数据库正在从内存向磁盘写一个数据页时,数据库宕机,从而导致这个页只写了部分数据,这就是部分写失效,它会导致数据丢失。这时是无法通过重做日志恢复的,因为重做日志记录的是对页的物理修改,如果页本身已经损坏,重做日志也无能为力。
这里写图片描述
1)内存中的两次写缓冲(doublewrite buffer),大小为2MB
2)磁盘上共享表空间中连续的128页,大小也为2MB

其原理是这样的:
1)当刷新缓冲池脏页时,并不直接写到数据文件中,而是先拷贝至内存中的两次写缓冲区。
2)接着从两次写缓冲区分两次写入磁盘共享表空间中,每次写入1MB
3)待第2步完成后,再将两次写缓冲区写入数据文件

其中第2步是额外的性能开销,但由于磁盘共享表空间是连续的,因此开销不是很大

三、自适应哈希索引(adaptive hash index)
由于innodb不支持hash索引,但是在某些情况下hash索引的效率很高,于是出现了 adaptive hash index功能,innodb存储引擎会监控对表上索引的查找。如果观察到建立hash索引可以提高性能的时候,则自动建立hash索引。

二、MyISAM
5.1之前版本采用的存储引擎,提供了包括全文索引,压缩,空间函数等,但MyISAM不支持事务和行级锁,而且有个缺陷就是崩溃后无法安全恢复。MyISAM会将表存储在两个文件中:数据文件和索引文件,分别以.MYD和.MYI为扩展名

三、MySQL内建的其他存储引擎
Archive引擎
只支持Insert和select操作,select查询需要执行全表扫描,适合日志和数据采集类应用。支持行级锁和高并发的插入。

Blackhole引擎
CSV引擎
Federated引擎
Memory引擎
Merge 引擎
NDB集群引擎

四、如何选择合适的引擎
大部分情况下,InnoDB都是正确的选择 除非需要用到某些InnoDB不具备的特性,并且没有其他办法可以替代,否则都应该优先选择InnoDB引擎。例如,要用到全文索引,建议优先考虑InnoDB加上Sphinx的组合。

除非万不得已,否则建议不要混合使用多种存储引擎,否则可能带来一系列复杂的问题,以及一些潜在的bug和边界问题。

日志型应用

假设需要实时地记录一台中心电话交换机的每一通电话的日志到MySQL中,或者通过Apache的mod_log_sql模块将网站的所有访问信息直接记录到表中。

这一类应用的插入速度有很高的要求,数据库不能成为瓶颈。MyISAM或者Archive存储引擎对这类应用比较合适,因为他们开销低,插入速度非常快。

做分析报表时,利用MySQL内置的复制方案将数据复制一份到备库,然后在备库,然后在备库上执行比较消耗时间和CPU的查询。

不要轻易相信“MyISAM比InnoDB快”之类的经验之谈,这个结论往往不是绝对的。在很多我们已知的场景中,InnoDB的速度都可以让MyISAM望尘莫及。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值