mysql存储引擎性能比较

来源:互联网 发布:ubuntu php模块 编辑:程序博客网 时间:2024/04/30 06:53

前言

今天看到有人面滴滴被问到知不知道mysql的引擎然后说不会被直接告知面试结束,然后想想自己mysql引擎也只是知道那么一两个还说不全。就想说在这里做个总结。

。。。。。凌晨三点半了。

在数据库中存的就是一张张有着千丝万缕关系的表,所以表设计的好坏,将直接影响着整个数据库。而在设计表的时候,我们都会关注一个问题,使用什么存储引擎。

什么是存储引擎?

关系数据库表是用于存储和组织信息的数据结构,可以将表理解为由行和列组成的表格,类似于Excel的电子表格的形式。有的表简单,有的表复杂,有的表根本不用来存储任何长期的数据,有的表读取时非常快,但是插入数据时去很差;而我们在实际开发过程中,就可能需要各种各样的表,不同的表,就意味着存储不同类型的数据,数据的处理上也会存在着差异,那么。对于MySQL来说,它提供了很多种类型的存储引擎,我们可以根据对数据处理的需求,选择不同的存储引擎,从而最大限度的利用MySQL强大的功能。


MYSQL存储引擎:

MyISAM: 拥有较高的插入,查询速度,但不支持事务
InnoDB :5.5版本后Mysql的默认数据库,事务型数据库的首选引擎,支持ACID事务,支持行级锁定
BDB: 源自Berkeley DB,事务型数据库的另一种选择,支持COMMIT和ROLLBACK等其他事务特性
Memory :所有数据置于内存的存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在Mysql重新启动时丢失
Merge :将一定数量的MyISAM表联合而成一个整体,在超大规模数据存储时很有用
Archive :非常适合存储大量的独立的,作为历史记录的数据。因为它们不经常被读取。Archive拥有高效的插入速度,但其对查询的支持相对较差
Federated: 将不同的Mysql服务器联合起来,逻辑上组成一个完整的数据库。非常适合分布式应用
Cluster/NDB :高冗余的存储引擎,用多台数据机器联合提供服务以提高整体性能和安全性。适合数据量大,安全和性能要求高的应用
CSV: 逻辑上由逗号分割数据的存储引擎。它会在数据库子目录里为每个数据表创建一个.CSV文件。这是一种普通文本文件,每个数据行占用一个文本行。CSV存储引擎不支持索引。
BlackHole :黑洞引擎,写入的任何数据都会消失,一般用于记录binlog做复制的中继。


在mysql客户端中,使用以下命令可以查看MySQL支持的引擎。

<span style="font-family:SimSun;">show engines</span>


引擎众多,主要介绍MyISAM和InnoDB。

可以看到InnoDB的注释:支持事务、行级锁定和外部键。

MyISAM则是 MyISAM存储引擎。


然后我针对不同引擎做了几个测试:

表的定义如下:


存储过程如下:

<span style="font-family:SimSun;">delimiter //create procedure myproc() begin declare num int; set num=1; while num < 10 do insert into t_tag(tag_name, tag_desc) values(concat("tag", num), concat("tag", num)); set num=num+1;end while; end//</span>


可以通过更改num的值去更新要插入的数据量。


首先是InnoDB的100W和10W的数据量:

10W(InnoDB)


10w(MyISAM)


100w(MyISAM)



10W数据量 INNODB设置autocommit=0;




通过一个数据量的一个简单比较:

可以简单发现:

  10W数据量   innodb(autocommit=1时){默认状态}   耗时:5.13分钟

  10W数据量   innodb(autocommit=0时)耗时:3.073秒

  10W数据量   MySIAM  耗时:8.347秒


测试结果总结:

可以看出在MySQL 5.5里面,MyISAM和InnoDB存储引擎性能差别并不是很大,针对InnoDB来说,影响性能的主要是
innodb_flush_log_at_trx_commit 这个选项,如果设置为1的话,那么每次插入数据的时候都会自动提交,导致性能急剧下降,应该是跟刷新日志有关系,设置为0效率能够看到明显提升,当然,我们可以SQL中提交“SET AUTOCOMMIT = 0”来设置达到好的性能。
同时也可以看出值得使用 InnoDB  来替代 MyISAM 引擎来进行开发,毕竟InnoDB 有多数据库特性、更良好的数据存储性能和查询性。


MyISAM表是独立于操作系统的,这说明可以轻松地将其从Windows服务器移植到Linux服务器;每当我们建立一个MyISAM引擎的表时,就会在本地磁盘上建立三个文件,文件名就是表。例如,建立了一个MyISAM引擎的tb_Demo表,那么就会生成以下三个文件:

1.tb_demo.frm,存储表定义;
2.tb_demo.MYD,存储数据;
3.tb_demo.MYI,存储索引。

MyISAM表无法处理事务,这就意味着有事务处理需求的表,不能使用MyISAM存储引擎。MyISAM存储引擎特别适合在以下几种情况下使用:

1.选择密集型的表。MyISAM存储引擎在筛选大量数据时非常迅速,这是它最突出的优点。
2.插入密集型的表。MyISAM的并发插入特性允许同时选择和插入数据。例如:MyISAM存储引擎很适合管理邮件或Web服务器日志数据。




然后根据查找的资料做一个简单的总结:

MySIAM 特点:

 数据存储方式简单,使用 B+ Tree 进行索引
 使用三个文件定义一个表:.MYI   .MYD   .frm
 少碎片、支持大文件、能够进行索引压缩
 二进制层次的文件可以移植 (Linux à Windows)
 访问速度飞快,是所有MySQL文件引擎中速度最快的
 不支持一些数据库特性,比如事务、外键约束等
 Table level lock,性能稍差,更适合读取多的操作
 表数据容量有限,一般建议单表数据量介于  50w–200w
 增删查改以后要使用 myisamchk 检查优化表

InnoDB 特点:

•使用 Table Space 的方式来进行数据存储 (ibdata1, ib_logfile0)
• 支持事务、外键约束等数据库特性
• Rows level lock , 读写性能都非常优秀
• 能够承载大数据量的存储和访问
• 拥有自己独立的缓冲池,能够缓存数据和索引
• 在关闭自动提交的情况下,与MyISAM引擎速度差异不大(甚至更快)

最后:
2.如何选择合适的存储引擎?
(1)选择标准可以分为:
(2)是否需要支持事务;
(3)是否需要使用热备;
(4)崩溃恢复:能否接受崩溃;
(5)是否需要外键支持;
然后按照标准,选择对应的存储引擎即可。
一般来说,如果需要事务支持,并且有较高的并发读取频率,InnoDB(默认哦)是不错的选择。
总体来讲,MyISAM适合SELECT密集型的表,而InnoDB适合INSERT和UPDATE密集型的表。

任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势。

1 0