前言

在日常开发过程中,很多时候需要代码性能上的调优,在大多数情况下,性能的好坏与数据库有着紧密的联系,因此很有必要学习一下数据库的存储原理,所以从MySQL的几种存储引擎开始,由浅入深,慢慢探索。

MySQL默认支持多种存储引擎,已使用与不同领域的数据库应用需求,用户可以通过选择不同的存储引擎提高应用的效率,提供灵活的存储。

可以通过以下方式查看当前数据库支持的存储引擎:

show ENGINES

mysql 支持列式存储查询 mysql支持哪些存储引擎_mysql 支持列式存储查询

从上图中可以看出,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_dirinnodb_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中使用该引擎作为临时表,存放查询的中间结果