前言
在日常开发过程中,很多时候需要代码性能上的调优,在大多数情况下,性能的好坏与数据库有着紧密的联系,因此很有必要学习一下数据库的存储原理,所以从MySQL的几种存储引擎开始,由浅入深,慢慢探索。
MySQL默认支持多种存储引擎,已使用与不同领域的数据库应用需求,用户可以通过选择不同的存储引擎提高应用的效率,提供灵活的存储。
可以通过以下方式查看当前数据库支持的存储引擎:
show ENGINES
从上图中可以看出,MySQL支持的存储引擎包括MRG_MYISAM、MyISAM、BLACKHOLE、CSV、MEMORY、ARCHIVE、InnoDB、PERFORMANCE_SCHEMA等,其中InnoDB为MySQL默认的存储引擎,笔者使用的MySQL版本号为5.5.49,不同版本会有差异。
几种常用的存储引擎特性
MyISAM
1、不支持事务、不支持外键
2、访问速度快,对事务完整性没有要求或者以SELECT、INSERT为主的应用可以使用这个引擎来建表
3、MyISAM表支持三种不同的存储格式,分别为静态表、动态表、压缩表。其中静态表是默认的存储格式,具有存储迅速,易缓存的优点,缺点是占用的空间比动态表多,动态表则占用空间相对较少,但是频繁的更新或删除记录会产生碎片,压缩表占据的磁盘空间非常小,由于每个记录是被单独压缩的,因此访问开支也非常小
4、每张使用MyISAM引擎建立的表对应磁盘中的3个文件,文件名和表名相同,扩展名分别为.frm(存储表定义)、.MYD(存储数据)、.MYI(存储索引)
InnoDB
1、支持事务、支持外键
2、支持自动增长列
3、写的处理效率差一些,占用更多的磁盘空间以保留数据和索引
3、InnoDB支持两种存储方式,分别为:共享表空间存储、多表空间存储。使用共享表空间存储时,表结构保存在.frm文件中,数据和索引保存在innodb_data_home_dir和innodb_data_file_path定义的表空间中,可以是多个文件;使用多表空间存储时,数据和索引单独保存在.ibd中
MEMORY
1、不支持事务、不支持外键
2、将数据存储在内存中,访问速度非常快
3、支持HASH和BTREE索引,默认使用hash索引
4、每个memory表只对应一个格式是.frm的磁盘文件
总结
三种主要的引擎特点如下表所示:
特点 | MyISAM | InnoDB | MEMORY |
存储限制 | 256TB | 64TB | RAM |
事务安全 | N | Y | N |
锁机制 | 表锁 | 行锁 | 表锁 |
B树索引 | Y | Y | Y |
HASH索引 | N | N | Y |
全文索引 | Y | N | N |
数据缓存 | N | Y | Y |
索引缓存 | Y | Y | Y |
数据可压缩 | Y | N | N |
空间使用 | 低 | 高 | N/A |
内存使用 | 低 | 高 | 中等 |
支持外键 | N | Y | N |
批量插入速度 | 高 | 低 | 高 |
如果数据表主要用来插入和查询记录,并且对事务的完整性、并发性要求不高,则MyISAM引擎能提供较高的处理效率
如果应用对事务的完整性有比较高的要求,在并发条件下还要求数据的一致性的能力,那么InnoDB是一个好的选择
如果只是临时存放数据,数据量较小且更新不太频繁,也不需要较高的数据安全性,则可以将数据保存在内存中的Memory引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果