MySQL中常用的存储引擎(MyISAM 和InnoDB)
Posted Streamice96
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL中常用的存储引擎(MyISAM 和InnoDB)相关的知识,希望对你有一定的参考价值。
数据库存储引擎是数据库底层软件组件,数据库管理系统(DBMS)使用存储引擎进行创建、查询、更新和删除数据操作。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。现在许多的数据库管理系统都支持多种不同的存储引擎。mysql的核心就是存储引擎。
使用 SHOW ENGINES; 命令查看MySQL支持的存储引擎, Support 列表示某种引擎是否可以使用,YES表示可以,NO表示不可以,DEFAULT表示当前默认存储引擎。
mysql> SHOW ENGINES; +--------------------+---------+----------------------------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+----------------------------------------------------------------------------------+--------------+------+------------+ | CSV | YES | Stores tables as CSV files | NO | NO | NO | | MRG_MyISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | | MyISAM | YES | Non-transactional engine with good performance and small data footprint | NO | NO | NO | | SEQUENCE | YES | Generated tables filled with sequential values | YES | NO | YES | | InnoDB | DEFAULT | Supports transactions, row-level locking, foreign keys and encryption for tables | YES | YES | YES | | Aria | YES | Crash-safe tables with MyISAM heritage | NO | NO | NO | | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | +--------------------+---------+----------------------------------------------------------------------------------+--------------+------+------------+ 8 rows in set (0.01 sec)
InnoDB存储引擎:
InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID[automiocity:原子性, consistency: 一致性, isolation: 隔离性, durability: 持久性]),支持锁定和外键(保证数据的一致性和完整性), 具有从服务崩溃中恢复的能力, 能够最大限度的保护数据。支持行级锁(可以提升多用户并发时的读写性能)
特点:
1. InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的事务安全存储引擎。InnoDB锁定在行级并且也在SELECT语句中提供一个类似Oracle的非锁定读。
这些功能增加了用户部署和性能,甚至在同一个查询中也可以混合。
2. InnoDB是为处理巨大数据量的最大性能设计。它的CPU效率可能是任何其他基于磁盘的关系数据库引擎所不能匹敌的。
3. InnoDB存储引擎完全与MySQL服务器整合,它为在主内存中缓存数据和索引而维持自己的缓冲池。InnoDB将它的表和索引存在一个逻辑空间中,表空间可以包含数个文件。
4. InnoDB支持外键完整性约束
5. InnoDB被用在众多需要高性能的大型数据库站点上。
6. 为MySQL提供了具有提交、回滚和崩溃恢复能力的事物安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT
语句中提供一个类似Oracle的非锁定读。
这些功能增加了多用户部署和性能。在SQL查询中,可以自由地将InnoDB类型的表和其他MySQL的表类型混合起来,甚至在同一个查询中也可以混合
7. InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB将它的表和索引在一个逻辑表空间中,表空间可以包含数个文件(或原始磁盘文件)。
这与MyISAM表不同,比如在MyISAM表中每个表被存放在分离的文件中。InnoDB表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上
8. InnoDB支持外键完整性约束,存储表中的数据时,每张表的存储都按主键顺序存放,如果没有显示在表定义时指定主键,InnoDB会为每一行生成一个6字节的ROWID,
并以此作为主键
使用 InnoDB存储引擎 MySQL将在数据目录下创建一个名为 ibdata1
的10MB大小的自动扩展数据文件,以及两个名为ib_logfile0
和ib_logfile1
的5MB大小的日志文件
设计遵循ACID模型,支持事务,具有从服务崩溃中恢复的能力,能够最大限度保护用户的数据
支持行级锁,可以提升多用户并发时的读写性能
支持外键,保证数据的一致性和完整性
InnoDB拥有自己独立的缓冲池,常用的数据和索引都在缓存中
对于INSERT、UPDATE、DELETE操作,InnoDB会使用一种change buffering的机制来自动优化,还可以提供一致性的读,并且还能够缓存变更的数据,减少磁盘I/O,提高性能
创建InnoDB表之后会产生两个文件
.frm表结构文件
.ibd,数据和索引存储表空间中
所有的表都需要创建主键,最好是配合上AUTO_INCREMENT,也可以放到经常查询的列作为主键
InnoDB的查询效率低于MyISAM
MyISAM存储引擎
MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事物。
特点:
1. 被大文件系统和操作系统支持
2. 当把删除和更新及插入操作混合使用的时候,动态尺寸的行产生更少碎片。这要通过合并相邻被删除的块,若下一个块被删除,就扩展到下一块自动完成
3. 每个MyISAM表最大索引数是64,这可以通过重新编译来改变。每个索引最大的列数是16
4. 最大的键长度是1000字节,这也可以通过编译来改变,对于键长度超过250字节的情况,一个超过1024字节的键将被用上
5. BLOB和TEXT列可以被索引
6. NULL被允许在索引的列中,这个值占每个键的0~1个字节
7. 所有数字键值以高字节优先被存储以允许一个更高的索引压缩
8. 每个MyISAM类型的表都有一个AUTO_INCREMENT的内部列,当INSERT和UPDATE操作的时候该列被更新,同时AUTO_INCREMENT列将被刷新。
所以说,MyISAM类型表的AUTO_INCREMENT列更新比InnoDB类型的AUTO_INCREMENT更快
9. 可以把数据文件和索引文件放在不同目录
10. 每个字符列可以有不同的字符集
11. 有VARCHAR的表可以固定或动态记录长度
12. VARCHAR和CHAR列可以多达64KB
使用MyISAM引擎创建数据库,将产生3个文件。文件的名字以表名字开始,扩展名之处文件类型:frm文件存储表定义、数据文件的扩展名为.MYD(MYData)、索引文件的扩展名时.MYI(MYIndex)
MyISAM存储引擎
默认MyISAM的表会在磁盘中产生3个文件
.frm: 表结构文件
.MYD: 数据文件
.MYI: 索引文件
可以在创建的时候指定数据文件和索引文件的存储位置,只有MyISAM表支持
DATA DIRECORY [=] 数据保存的绝对路径
INDEX DIRECTORY [=] 索引文件保存的绝对路径
MyISAM单表最大支持的数据量2的64次方条记录
每个表最多可以建立64个索引
如果是复合索引,每个复合索引最多包含16个列,索引值最大长度是1000B
MyISAM引擎的存储格式
定长(FIXED 静态): 是指字段中不包含VARCHAR/TEXT/BLOB
动态(DYNAMIC): 只要字段中包含了VARCHAR/TEXT/BLOB
压缩(COMPRESSED): myisampack创建
--测试MyISAM存储引擎
mysql> CREATE TABLE myisam_1( -> a CHAR(30), -> id INT -> )ENGINE=MyISAM; Query OK, 0 rows affected (0.01 sec) mysql> SHOW CREATE TABLE myisam; ERROR 1146 (42S02): Table \'test.myisam\' doesn\'t exist mysql> SHOW CREATE TABLE myisam_1; +----------+---------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +----------+---------------------------------------------------------------------------------------------------------------------------+ | myisam_1 | CREATE TABLE `myisam_1` ( `a` char(30) DEFAULT NULL, `id` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 | +----------+---------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.01 sec) mysql> SHOW TABLE STATUS LIKE \'myisam_1\'\\G; *************************** 1. row *************************** Name: myisam_1 Engine: MyISAM Version: 10 Row_format: Fixed---------------<-----------定长(FIXED 静态), 是指字段中不包含VARCHAR/TEXT/BLOB Rows: 0 Avg_row_length: 0 Data_length: 0 Max_data_length: 9851624184872959 Index_length: 1024 Data_free: 0 Auto_increment: NULL Create_time: 2019-09-21 14:40:44 Update_time: 2019-09-21 14:40:44 Check_time: NULL Collation: latin1_swedish_ci Checksum: NULL Create_options: Comment: Max_index_length: 17179868160 Temporary: N 1 row in set (0.01 sec)
1 mysql> CREATE TABLE myisam_2( 2 -> a VARCHAR(30), 3 -> id INT 4 -> )ENGINE=MyISAM; 5 Query OK, 0 rows affected (0.01 sec) 6 7 mysql> SHOW TABLE STATUS LIKE \'myisam_2\'\\G; 8 *************************** 1. row *************************** 9 Name: myisam_2 10 Engine: MyISAM 11 Version: 10 12 Row_format: Dynamic-------------------<----------------动态(DYNAMIC),只要字段中包含了VARCHAR/TEXT/BLOB 13 Rows: 0 动态表处理数据要复杂, 因为动态表在查询和存储数据时在每行有一个行头来标识这一行记录的长度 14 Avg_row_length: 0 若经常更新表的话, 会产生很多的碎片, (可以用optimize table进行优化) 15 Data_length: 0 16 Max_data_length: 281474976710655 17 Index_length: 1024 18 Data_free: 0 19 Auto_increment: NULL 20 Create_time: 2019-09-21 14:51:40 21 Update_time: 2019-09-21 14:51:40 22 Check_time: NULL 23 Collation: latin1_swedish_ci 24 Checksum: NULL 25 Create_options: 26 Comment: 27 Max_index_length: 17179868160 28 Temporary: N 29 1 row in set (0.00 sec)
--通过 ROW_FORMAT=FIXED 设置包含有VARCHAR等属性的字段为(Dynamic-->Fixed), 静态的查找速度较快, 因为每一行的值得长度是固定的(若有索引, 可以根据 行号*固定长度=精确位置 来实现快速查找)
CREATE TABLE myisam_3(
a VARCHAR(30),
id INT
)ENGINE=MyISAM ROW_FORMAT=FIXED DEFAULT CHARSET=UTF8;
mysql> CREATE TABLE myisam_3( -> a VARCHAR(30), -> id INT -> )ENGINE=MyISAM ROW_FORMAT=FIXED DEFAULT CHARSET=UTF8; Query OK, 0 rows affected (0.01 sec) mysql> SHOW TABLE STATUS \'myisam_3\'\\G; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near \'\'myisam_3\'\' at line 1 ERROR: No query specified mysql> SHOW TABLE STATUS LIKE \'myisam_3\'\\G; *************************** 1. row *************************** Name: myisam_3 Engine: MyISAM Version: 10 Row_format: Fixed Rows: 0 Avg_row_length: 0 Data_length: 0 Max_data_length: 27021597764222975 Index_length: 1024 Data_free: 0 Auto_increment: NULL Create_time: 2019-09-21 15:02:58 Update_time: 2019-09-21 15:02:58 Check_time: NULL Collation: utf8_general_ci Checksum: NULL Create_options: row_format=FIXED Comment: Max_index_length: 17179868160 Temporary: N 1 row in set (0.00 sec)
MEMORY存储引擎:
MEMORY存储引擎将表中的数据存储到内存中,为查询和引用其他表数据提供快速访问。
特点:
- MEMORY表的每个表可以有多达32个索引,每个索引16列,以及500字节的最大键长度
- MEMORY存储引擎执行HASH和BTREE缩影
- 可以在一个MEMORY表中有非唯一键值
- MEMORY表使用一个固定的记录长度格式
- MEMORY不支持BLOB或TEXT列
- MEMORY支持AUTO_INCREMENT列和对可包含NULL值的列的索引
- MEMORY表在所由客户端之间共享(就像其他任何非TEMPORARY表)
- MEMORY表内存被存储在内存中,内存是MEMORY表和服务器在查询处理时的空闲中,创建的内部表共享
- 当不再需要MEMORY表的内容时,要释放被MEMORY表使用的内存,应该执行
DELETE FROM
或TRUNCATE TABLE
,或者删除整个表(使用DROP TABLE)
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
InnoDB: 支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。
MyISAM: 插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比 较低,也可以使用。
MEMORY: 所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。
注:同一个数据库也可以使用多种存储引擎的表。如果一个表要求比较高的事务处理,可以选择InnoDB。这个数据库中可以将查询要求比较高的表选择MyISAM存储。如果该数据库需要一个用于查询的临时表,可以选择MEMORY存储引擎。
---------------------------------------------------------------------------------------------------------------------------------------------------------
MySQL架构总共四层,在上图中以虚线作为划分。
首先,最上层的服务并不是MySQL独有的,大多数给予网络的客户端/服务器的工具或者服务都有类似的架构。比如:连接处理、授权认证、安全等。
第二层的架构包括大多数的MySQL的核心服务。包括:查询解析、分析、优化、缓存以及所有的内置函数(例如:日期、时间、数学和加密函数)。
同时,所有的跨存储引擎的功能都在这一层实现:存储过程、触发器、视图等。
第三层包含了存储引擎。存储引擎负责MySQL中数据的存储和提取。服务器通过API和存储引擎进行通信。这些接口屏蔽了不同存储引擎之间的差异,使得这些差异对上层的查询过程透明化。
存储引擎API包含十几个底层函数,用于执行“开始一个事务”等操作。但存储引擎一般不会去解析SQL(InnoDB会解析外键定义,因为其本身没有实现该功能),
不同存储引擎之间也不会相互通信,而只是简单的响应上层的服务器请求。
第四层包含了文件系统,所有的表结构和数据以及用户操作的日志最终还是以文件的形式存储在硬盘上。
以上是关于MySQL中常用的存储引擎(MyISAM 和InnoDB)的主要内容,如果未能解决你的问题,请参考以下文章