存储引擎
0. 前言
1. 存储引擎查看
2. InnoDB存储引擎特性存储InnoDB历史
3. MyISAM存储引擎前言特性加锁与并发修复索引特性延迟更新索引键存储压缩表性能
4. InnoDB和MyISAM对比
5. MySQL其他存储引擎MEMORY存储引擎ARCHIVE存储引擎CSV存储引擎如何选择合适的存储引擎
0. 前言
数据库存储引擎是数据库底层软件组织,数据库管理系统使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。
1. 存储引擎查看
使用命令SHOW ENGINES来查看MySQL使用的引擎
MySQL使用的引擎
查看数据库默认引擎 :
SHOW VARIABLES LIKE 'storage_engine';
2. InnoDB存储引擎
特性
1、是Mysql默认的事务型引擎,也是最重要、使用最广泛的存储引擎。 2、高性能和自动崩溃恢复特性 3、InnoDB是为处理巨大数据量的最大性能设计。 4、InnoDB存储引擎完全与MySQL服务器整合,InnoDB存储引擎维持它自己的缓冲池。 5、InnoDB支持外键完整性约束,存储表中的数据时,每张表的存储都按主键顺序存放。 6、InnoDB被用在众多需要高性能的大型数据库站点上 7、作为事务型的存储引擎,InnoDB通过一些机制和工具支持真正的热备份。 8、InnoDB表是基于聚簇索引建立的。 使用InnoDB时,MySQL将在MySQL数据目录下创建一个名为ibdata1的10MB大小的自动扩展数据文件,以及两个名为ib_logfile0和ib_logfile1的5MB大小的日志文件用于支持事务的持久性。
存储
存储文件:表空间文件、重做日志文件。
表空间文件:InnoDB引擎将存储的数据按照表空间进行存放的设计。在默认配置下有一个初始大小10M,名为ibdata1的文件。该文件就是默认的表空间文件,可以通过innodb_data_file_path参数配置,格式如下:
代码语言:javascript复制innodb_data_file_path = datafile1_spec1
[;datafile2_spec2]...
用户通过多个文件组成表空间,同时制定文件的属性,如:innodb_data_file_path = c:/innodb:2000M;d:/innodb2:2000M
,innodb_file_per_table参数,则每个InnoDB表产生一个独立的表空间。命名规则 表名.ibd,不再将所有数据存放在默认的表空间。
日志文件 ib_logfile0、ib_logfile1。这两个就是重做日志文件。每个InnoDB引擎至少有一个重做日志文件组,每个文件组至少两个重做日志文件。影响重做日志属性的参数有: 1. innodb_log_file_size 每个重做日志的大小 2. innodb_log_files_in_group 重做文件日志组中日志文件的数量,默认为2。 3. innodb_mirrored_log_groups 日志镜像文件组的数量,默认1。表示只有一个日志文件组,没有镜像。 4. innodb_log_group_home_dir 日志文件组所在路径,默认./ 表示在MySQL的数据目录下。
InnoDB历史
2008年,InnoDB plugin,适用于Mysql 5.1版本。
Oracle收购sun,Mysql5.5
3. MyISAM存储引擎
前言
在Mysql5.1及之前的版本,MyISAM是默认的存储引擎。MyISAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM不支持事务和行级锁,一个事务插入时,会将整个表锁住。而且有一个毫无疑问的缺陷就是崩溃后无法完全恢复。 尽管如此,MyISAM绝不是一无是处的,对于只读的数据,或者表比较小、可以忍受修复操作,则依然可以继续使用MyISAM引擎。
特性
加锁与并发
MyISAM对整张表加锁,而不是针对行。
修复
对于MyISAM表,MySQL可以手工或自动执行检查和修复操作,但这里说的修复和事务恢复以及崩溃恢复是不同的概念。执行表的修复可能导致一些数据丢失,而且修复操作是非常慢的。可以通过CHECK TABLE mytable检查表的错误,如果有错误可以通过执行REPAIR TABLE mystable进行修复。另外,如果MySQL服务器已经关闭,也可以通过myisamchk命令工具进行检查和修复操作。
索引特性
对于MyISAM表,即使是BLOB和TEXT等字段,也可以基于前500个字符创建索引。MyISAM也支持全文索引,这是一种基于分词创建的索引,可以支持复杂的查询。
延迟更新索引键
创建MyISAM表的时候,如果指定了DELAY_KEY_WRITE选项,在每次修改执行完成时,不会立刻将修改的索引数据写入磁盘 ,而是会写到内存中的键缓冲区,只有在清理键缓冲区或者关闭表的时候才会将对应的索引快写入到磁盘。 使用MyISAM引擎创建数据库,将产生3个文件。文件的名字以表名字开始,扩展名之处文件类型:frm文件存储表定义、数据文件的扩展名为.MYD(MYData)、索引文件的扩展名时.MYI(MYIndex)
存储
数据文件和索引文件,分别以.MYD和.MYI为扩展名。
压缩表
如果表在创建并导入数据以后,不会再进行修改操作,那么这样的表或许适合采用MyISAM压缩表。 可以使用myisampack对MyISAM表进行压缩(也较打包pack)。
性能
MyISAM有一些服务器级别的性能扩展限制,比如对索引键缓冲区(key cache)的Mutex锁,MariaDB基于段(segment)的索引键缓冲区机制。但MyISAM最典型的性能问题还是表锁的问题,如果你发现所有的查询都长期处于“Locked”状态,那么毫无疑问表锁就是罪魁祸首。
4. InnoDB和MyISAM对比
1、由于锁粒度的不同,InnoDB比MyISAM支持更高的并发; 2、InnoDB为行级锁,MyISAM为表级锁。 3、在备份容灾上,InnoDB支持在线热备,有很成熟的在线热备解决方案; 4、查询性能上,MyISAM的查询效率高于InnoDB。 5、SELECT COUNT(*) 语句,如果行数在千万级别以上,MyISAM可以快速查出,而InnoDB查询的特别慢。 6、MyISAM的表结构文件包括:.frm(表结构定义),.MYI(索引),.MYD(数据); 而InnoDB的表数据文件为:.ibd和.frm(表结构定义);
5. MySQL其他存储引擎
MEMORY存储引擎
将数据存在内存中,和市场上的Redis,memcached等思想类似,为了提高数据的访问速度,主要特点: (1)支持的数据类型有限制 (2)支持的锁粒度为表级锁。 (3)由于数据是存放在内存中,所以在服务器重启之后,所有数据都会丢失; (4)查询的时候,如果有用到临时表,而且临时表中有BLOB,TEXT类型的字段,那么这个临时表就会转化为MyISAM类型的表,性能会急剧降低;
ARCHIVE存储引擎
ARCHIVE存储引擎适合的场景有限,由于其支持压缩,故主要是用来做日志,流水等数据的归档,主要特点: (1)支持Zlib压缩,数据在插入表之前,会先被压缩;
(2)仅支持SELECT和INSERT操作,存入的数据就只能查询,不能做修改和删除;
(3)只支持自增键上的索引,不支持其他索引;
CSV存储引擎
数据中转试用,主要特点:
(1)其数据格式为.csv格式的文本,可以直接编辑保存;
(2)导入导出比较方便,可以将某个表中的数据直接导出为csv,试用Excel办公软件打开;
如何选择合适的存储引擎
1、使用场景是否需要事务支持;
2、是否需要支持高并发,InnoDB的并发度远高于MyISAM;
3、是否需要支持外键;
4、是否需要支持在线热备;
5、高效缓冲数据,InnoDB对数据和索引都做了缓冲,而MyISAM只缓冲了索引;
6、索引,不同存储引擎的索引并不太一样;