【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
**开源地址:https://docs.qq.com/doc/DSmxTbFJ1cmN1R2dB **
存储引擎指定了表的类型,即如何存储和索引数据、是否支持事务等,同时存储引擎也决定了表在计算机中的存储方式。
查看MySQL支持的存储引擎:命令:show engines;
MyISAM
- MyISAM引擎特点:
-
不支持事务:事务是指逻辑上的一组操作,组成这组操作的各个单元,要么全成功要么全失败。
-
表级锁定:数据更新时锁定整个表:也就是对表中的一个数据进行操作都会将这个表锁定,其他人不能操作这个表,这虽然可以让锁定的实现成本很小但是也同时大大降低了其并发性能。
-
读写互相阻塞:不仅会在写入的时候阻塞读取,MyISAM还会在读取的时候阻塞写入,但读本身并不会阻塞另外的读。
-
只会缓存索引:MyISAM可以通过key_buffer_size的值来提高缓存索引,以大大提高访问性能减少磁盘IO,但是这个缓存区只会缓存索引,而不会缓存数据。
-
读取速度较快:占用资源相对较少
-
不支持外键约束,但只是全文索引
-
MyISAM引擎是MySQL5.5版本之前的默认引擎,是对最初的ISAM引擎优化的产物。
- MyISAM引擎适用的生产业务场景
1. 不需要事务支持的业务(例如转账就不行,充值也不行)
2. 一般为读数据比较多的应用,读写都频繁场景不适合,读多或者写多的都适合。
3. 读写并发访问都相对较低的业务(纯读纯写高并发也可以)(锁定机制问题)
4. 数据修改相对较少的业务(阻塞问题)
5. 以读为主的业务,例如:www.blog,图片信息数据库,用户数据库,商品库等业务
6. 对数据一致性要求不是很高的业务。
7. 中小型的网站部分业务会用。
小结:单一对数据库的操作都可以示用MyISAM,所谓单一就是尽量纯读,或纯写(insert,update,delete)等。
InnoDB引擎
InnoDB引擎为目前MySQL AB所发行新版的标准。
和其他的存储引擎相比,InnoDB引擎的优点是支持兼容ACID的事务,以及参数完整性(即对外键的支持)。
- InnoDB引擎特点:
1. 支持事务:支持4个事务隔离界别,支持多版本读。
2. 行级锁定(更新时一般是锁定当前行):通过索引实现,全表扫描仍然会是表锁,注意间隙锁的影响。
3. 读写阻塞与事务隔离级别相关(有多个级别)。
4. 具体非常高效的缓存特性:能缓存索引,也能缓存数据。
5. 整个表和主键与Cluster方式存储,组成一颗平衡树。
6. 所有SecondaryIndex都会保存主键信息。
7. 支持分区,表空间,类似oracle数据库。
8. 支持外键约束;外键约束其实降低了表的查询速度,但是增加了表之间的耦合度。
9. 和MyISAM引擎比较,InnoDB对硬件资源要求还是比较高的。
10. 可以通过自动增长列,方法是auto_increment。
11. 使用的锁粒度为行级锁,可以支持更高的并发;
12. 配合一些热备工具可以支持在线热备份;
13. 在InnoDB中存在着缓冲管理,通过缓冲池,将索引和数据全部缓存起来,加快查询的速度;
14. 对于InnoDB类型的表,其数据的物理组织形式是聚簇表。所有的数据按照主键来组织。数据和索引放在一块,都位于B+数的叶子节点上;
当然InnoDB的存储表和索引也有下面两种形式:
-
使用共享表空间存储:所有的表和索引存放在同一个表空间中。
-
使用多表空间存储:表结构放在frm文件,数据和索引放在IBD文件中。分区表的话,每个分区对应单独的IBD文件,分区表的定义可以查看我的其他文章。使用分区表的好处在于提升查询效率。