数据库引擎
数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限和快速处理事务,从而满足企业内大多数需要处理大量数据的应用程序的要求。
Innodb
Innodb提供了对数据库ACID事务的支持,并且实现SQL标准的四种隔离级别 <1>,该引擎还提供了行级锁 <2> 和外键约束,它的设计目标是处理大容量数据库系统,它本身基于MySQL后台的完整数据库系统,MySQL运行时Innodb会在内存中建立缓冲池,用于缓冲数据和索引,但Innodb不支持全文检索(FULLTEXT)<3>而且它没有保存表的行数,当 select count(*
) from table 时需要扫描全表。当需要使用数据库事务时,该引擎当然是首选。由于锁的粒度更小,写操作时不会锁定全表,,所以在并发较高时,使用Innodb引擎会提升效率。但行级锁不是万能的,如果一个SQL语句不能确定扫描范围时,Innodb仍然会锁全表。
<1>: 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted(未授权读取、读未提交)、Read committed(授权读取、读提交)、Repeatable read(可重复读取)、Serializable(序列化),这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。
<2>: 行级锁:仅对指定的记录进行加锁,这样其它进程还是可以对同一个表中的其它记录进行操作。
<3>: 全文检索:先建立索引,再通过索引进行搜索就是全文检索
MyISAM
MyISAM是MySQL默认的引擎,但是它没有提供对数据库事务的支持,也不支持行级锁和外键,因此在insert或者update数据时即写操作需要锁定整个表,不过MyISAM中存储了表的行数,于是当select count(*
) from table 时只需要直接读取已经保存好的值。
两种引擎的对比表
Innodb | MyISAM |
---|---|
对事务的支持 | 支持ACID事务 |
锁 | 支持行级锁 |
全文检索 | 不支持 |
保存表的行数 | 没有 |
索引 | 主键下存储该行的数据,此索引指向对主键的引用 |
两种引擎的选择
大尺寸的数据集趋向于选择Innodb引擎,因为它支持处理和故障修复。数据库大小决定了故障回复的时间长短,Innodb可以利用事务 日志进行数据恢复,这会比较快。主键查询在Innodb引擎下也会相当快,不过如果主键太长也会导致性能问题。大批量的insert(批量插入)语句在MyISAM下会快一些,但update语句在Innodb下则会更快一些,尤其在并发大时。