MySQL存储引擎
存储引擎就是存储数据,建立索引,更新查询数据等等技术的实现方式 。存储引擎是基于表的,而不是基于库的。所以存储引擎也可被称为表类型。
和大多数的数据库不同, MySQL中有一个存储引擎的概念, 针对不同的存储需求可以选择最优的存储引擎。
Oracle,SqlServer等数据库只有一种存储引擎。MySQL提供了插件式的存储引擎架构。所以MySQL存在多种存储引擎,可以根据需要使用相应引擎,或者编写存储引擎。
可以通过指定 show engines , 来查询当前数据库支持的存储引擎 :
创建新表时如果不指定存储引擎,那么系统就会使用默认的存储引擎,MySQL5.5之前的默认存储引擎是MyISAM,5.5之后就改为了InnoDB。
查看Mysql数据库默认的存储引擎 , 指令 :
show variables like '%storage_engine%'
下面对比一下几种常见的存储引擎:
而其中InnoDB、MySAM、MEMORY最为常见
引擎 | 说明 |
InnoDB | 提供对数据库 ACID 事务的支持,同时提供了行级锁和外键的约束,其设计目标是处理大数据 |
MySAM | 默认引擎,不提供事务的支持,也不支持行级锁和外键 |
MEMORY | 所有数据均存于内存,存取速度快,但是安全性低 |
InnoDB
- 插入缓冲(Insert Buffer)
- 二次写(Double Write)
- 自适应哈希索引(Ahi)
- 预读(Read Ahead)
存储方式:
InnoDB 存储表和索引有以下两种方式 :
①. 使用共享表空间存储, 这种方式创建的表的表结构保存在.frm文件中, 数据和索引保存在 innodb_data_home_dir 和 innodb_data_file_path定义的表空间中,可以是多个文件。
②. 使用多表空间存储, 这种方式创建的表的表结构仍然存在 .frm 文件中,但是每个表的数据和索引单独保存在 .ibd 中。
MyISAM
MyISAM 不支持事务、也不支持外键,其优势是访问的速度快,对事务的完整性没有要求或者以SELECT、INSERT为主的应用基本上都可以使用这个引擎来创建表 。
文件存储方式:
每个MyISAM在磁盘上存储成3个文件,其文件名都和表名相同,但拓展名分别是 :
.frm (存储表定义);
.MYD(MYData , 存储数据);
.MYI(MYIndex , 存储索引);
InnoDB vs MySAM
两者主要区别如下:
- InnoDB 索引是聚簇索引,而 MyISAM 是非聚簇索引;
- InnoDB 的主键索引的叶子节点存储着行数据,因此主键索引效率高;MyISAM 索引的叶子节点存储的是行数据地址,需要多进行一次寻址操作才能够得到数据;
- InnoDB 非主键索引的叶子节点存储的是主键和其他带索引的列数据,因此查询时做到覆盖索引更加高效;
- MySAM存储空间可被压缩,存储空间较小,而InnoDB需要更多的内存和存储,会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引;
- MySAM数据以文件形式存储,在跨平台的数据转移中会很方便,在备份和恢复时可单独针对某个表进行操作,而InnoDB在数据进行移植或者备份恢复的时候免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump,在数据达到一定量(几十 G)的时候就相对麻烦了。
索引的选择
在选择存储引擎时,应该根据应用系统的特点选择合适的存储引擎。对于复杂的应用系统,还可以根据实际情况选择多种存储引擎进行组合。以下是几种常用的存储引擎的使用环境。
-
InnoDB : 是Mysql的默认存储引擎,用于事务处理应用程序,支持外键。如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询意外,还包含很多的更新、删除操作,那么InnoDB存储引擎是比较合适的选择。InnoDB存储引擎除了有效的降低由于删除和更新导致的锁定, 还可以确保事务的完整提交和回滚,对于类似于计费系统或者财务系统等对数据准确性要求比较高的系统,InnoDB是最合适的选择。
-
MyISAM : 如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不是很高,是 Web、数据仓库和其他应用环境下最常使用的引擎之一;
-
MEMORY:将所有数据保存在RAM中,在需要快速定位记录和其他类似数据环境下,可以提供几块的访问。MEMORY的缺陷就是对表的大小有限制,太大的表无法缓存在内存中,其次是要确保表的数据可以恢复,数据库异常终止后表中的数据是可以恢复的。MEMORY表通常用于更新不太频繁的小表,用以快速得到访问结果。
-