数据库管理系统(DBMS)使用数据引擎进行创建,查询,更新和删除数据。不同的存储引擎提供不同的存储机制,索引技巧,锁定水平等。Mysql的核心就是存储引擎。
1.查看mysql的存储引擎(版本mysql5.7)
show engines;
2,几种常用的存储引擎
对比
| 支持内容 | Innodb | MyISAM |
| 是否支持事务 | 支持ACID事务 | 不支持 |
| 使用的锁 | 行级锁 | 表级锁 |
| 是否支持并发 | 支持,采用多版本并发控制(mvcc) | 不支持,并发性差 |
| 缓存 | 缓冲索引也缓冲数据 | 只缓存索引 |
| 是否支持外键 | 支持 | 不支持 |
InnoDB引擎
①Mysql默认的存储引擎,事务性数据库的首选引擎,支持事务的ACID特性,行锁定和外键。
②InnoDB是为处理巨大数据量的最大性能设计,CPU效率可能是其他任何关系型数据引擎不能匹敌的。
③InnoDB为在主内存中缓存数据和索引而维持它自己的缓冲池。
④InnoDB支持外键完整性约束,存储数据时,每张表的顺序都按主键顺序存放,若没有指定主键,会为每一行生成一个6字节的ROWID,并将此作为主键。
⑤InnoDB被用在需要高性能的大型数据库站点上,InnoDB不创建目录,使用InnoDB时,MySQL将在MySQL数据目录下创建一个名为ibdata1的10MB大小的自动扩展数据文件,以及两个名为ib_logfile0和ib_logfile1的5MB大小的日志文件
MyISAM引擎
MyISAM拥有较高的插入,查询速度,但不支持事务。
①大文件(63位文件长度),在支持大文件的文件系统上被支持。
②插入,删除,更新,动态尺寸的行产生更少的碎片。
③每个MyISAM表的最大索引数是64,可以通过重新编译来改变,每个索引的最大列数为16。
④每个MyISAM类型的表都有一个AUTO_INCREMENT的内部列,当INSERT和UPDATE操作的时候该列被更新,同时AUTO_INCREMENT列将被刷新。所以说,MyISAM类型表的AUTO_INCREMENT列更新比InnoDB类型的AUTO_INCREMENT更快。
⑤使用MyISAM引擎创建数据库,将产生3个文件。文件的名字以表名字开始,扩展名之处文件类型:frm文件存储表定义、数据文件的扩展名为.MYD(MYData)、索引文件的扩展名时.MYI(MYIndex)
Memory引擎
①将数据存放到内存中,快速访问。最大索引数是32,每个索引的最大列数为16。
②可以在一个memory表中有非唯一键值。
③当不再需要MEMORY表的内容时,要释放被MEMORY表使用的内存,应该执行DELETE FROM或TRUNCATE TABLE,或者删除整个表(使用DROP TABLE)。
存储引擎的选择
(图转载)
①如果要提供提交、回滚、崩溃恢复能力的事物安全(ACID兼容)能力,并要求实现并发控制,InnoDB是一个好的选择
②如果数据表主要用来插入和查询记录,则MyISAM引擎能提供较高的处理效率。
③如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果
④一个数据库中多个表可以使用不同引擎以满足各种性能和实际需求
3.MyISAM比Innodb查询速度快的原因
在做select查询的时候,Innodb维护的东西比Myisam维护的东西要多
①数据块,Innodb缓存数据和索引,而Myisam只缓存索引。
②Innodb的寻址要映射到块,再由块映射到行(B+树,索引目录找到页)。而Myisam记录的是文件offset,定位快。
③innodb还需要维护mvcc的一致性,
myisam和innodb的索引。https://blog.csdn.net/nuli888/article/details/52443011
4.项目的数据库设计
实现数据的插入与查询,插入频繁,查询也频繁,但是我们对查询的要求行更高,保证数据的在web和手机端的显示速度。所以我们底层的存储引擎使用Myisam,在select查询方面做的更好。