MySQL存储引擎InnoDB和MyISAM详解
参考文档:
什么是MySQL存储引擎
存储引擎说白了就是告诉MySQL如何存储数据、怎么样建立索引以及如何查询更新数据等的实现方法。
MySQL存储引擎之InnoDB
MySQL5.5 版本及之后默认存储引擎InnoDB,是MySQL推荐使用的存储引擎。支持事务,行级锁定,外键约束。事务安全型存储引擎。更加注重数据的完整性和安全性。
- 数据存储格式
## 数据库数据文件存储位置,可以进行修改
[root@localhost test_orders]# pwd
/var/lib/mysql/test_orders
## test_orders 存储引擎是InnoDB ,查看数据库有哪些文件
[root@localhost test_orders]# ls
## db.opt存放了数据库的配置信息,比如数据库的字符集还有编码格式
db.opt
## .frm文件是表结构文件:表结构、元数据(描述数据的数据)、和表结构定义信息
tb_order.frm
##.ibd文件是表索引文件,包括了单独一个表的数据及索引内容
tb_order.ibd
tb_user.frm
tb_user.ibd
- 数据存储特点
InnoDB表是基于聚簇索引建立的,聚簇索引对主键的查询有很高的性能,不过他的二级索引(非主键索引)必须包含主键列,索引其他
的索引会很大。
- 锁的粒度
行锁
- 事务支持
事务、外键约束 : 都是为了维护数据的完整性。
并发性处理:innodb擅长处理并发的。因为它使用了行级锁定,只该行锁了,其它行没有锁。
行级锁定:row-level locking,实现了行级锁定,在一定情况下,可以选择行级锁来提升并发性。也支持表级锁定,Innodb会自带锁,
不需要我们自己设置。
MySQL存储引擎之MyISAM
MySQL5.5版本之前默认的存储引擎。
- 数据存储格式
## 数据库数据文件存储位置,可以进行修改
[root@localhost test_orders2]# pwd
/var/lib/mysql/test_orders2
##test_orders2存储引擎为:MyISAM 查看数据库有哪些文件
[root@localhost test_orders2]# ls
## db.opt存放了数据库的配置信息,比如数据库的字符集还有编码格式
db.opt
## .frm文件是表结构文件:表结构、元数据(描述数据的数据)、和表结构定义信息
tb_order.frm
## .MYD存储表的数据
tb_order.MYD
## 存储表的索引
tb_order.MYI
tb_user.frm
tb_user.MYD
tb_user.MYI
- 数据存储特点
MyISAM是基于非聚簇索引进行存储的 - 锁的粒度
MyISAM不支持行锁,读取时会对表加上共享锁,在写入时对表加入排它锁,是对整表加锁,所以写入时效率会比较低 - 事务支持
不支持事务
InNoDB和MyISAM比较
对比项 | InnoDB | MyISAM |
---|---|---|
主外键 | 支持 | 支持 |
事务 | 支持 | 不 支持 |
行表锁 | 行锁:操作时值锁定某一行,不对其他行有影响 | 表锁:即使操作一条记录也会锁住整个表,不适合高并发的操作 |
缓存 | 不仅缓存索引还要缓存真实数据,对内存要求较高,而且内存大小对性能有决定性的影响 | 只缓存索引,不缓存真实数据 |
表空间 | 大 | 小 |
关注点 | 事务 | 性能 |
默认安装 | 5.5及之后默认支持 | 5.5之前默认支持 |
Innodb :数据完整性,并发性处理,擅长更新,删除。
myisam:高速查询及插入。擅长插入和查询。
具体举例:
- 那么对于微博项目来看,选择哪一个存储引擎呢?
a.微博主要是插入微博和查询微博列表,较为适合MyISAM;
b.微博在更新微博和删除微博,要少的多,较为适合MyISAM;
c.对数据完整性的需求并没有那么强烈,比如用户删除微博,关联的转播和评论并不要求都做相应的行为,较为适合MyISAM;- 那么对于记账财务系统,选择哪一款存储引擎呢?
a.财务系统除了读取和插入,经常要进行数据的修改和删除,较为适合InnoDB;
b.在进行财务变更的时候,如果失败需要回滚必须用到事务,较为适合InnoDB;
c.每个用户的财务数据完整性和同步性非常重要,需要外键支持,否则财务将会混乱,较为适合InnoDB。