MySQL之InnoDB和MyISAM存储引擎

2020-01-10  本文已影响0人  猿来是八阿哥
mysql

存储引擎在MySQL的逻辑架构中位于第三层,负责MySQL中的数据的存储和提取。
MySQL存储引擎有很多,不同的存储引擎保存数据和索引的方式是不同的。
每一种存储引擎都有它的优势和劣势,最常见的两种存储引擎是 InnoDBMyISAM

一、MySQL支持的存储引擎

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)

二、InnoDB

InnoDB 是 MySQL 中默认的事务型存储引擎,更关注事务实现,一般情况下我会选择使用 InnoDB。

1. 数据存储方式

使用 InnoDB 作为存储引擎时,以表 user 为例,在磁盘上将出现两个文件:user.frmuser.ibd,其中:

2. 锁

InnoDB 的锁粒度是 ,但 在未使用索引或者索引失效时,将升级为表锁

3. 事务

Innodb 实现了四个隔离级别,默认的隔离级别是 repeatable-read,并通过 MVCC(多版本控制) 的方式来支持高并发。

4. 聚簇索引

Innodb 的表数据是基于 聚簇索引 存储的,对主键查询有很高的性能,但对非主键索引和二级索引来说必须包含主键索引,索引其他索引的数据消耗会很大。

三、MyISAM

MyISAM 更关注性能,在不包含事务操作的表上,我会选择使用 MyISAM。

1. 数据存储方式

使用 MyISAM 作为存储引擎时,以表 user 为例,在磁盘上将出现三个文件:user.frmuser.MYDuser.MYI,其中:

2. 锁

MyISAM 不支持行锁,只支持表锁。在读取数据时,将对整个表增加 共享锁。在写入数据时,将对整个表增加 排它锁。因此,在并发场景下,MyISAM 的读性能很高,写性能较低。

3. 事务

MyISAM 是不支持事务的。

4. 索引

MyISAM 是基于非聚簇索引存储数据的。

5. 其他

四、MyISAM 和 InnoDB 如何选择

1. 是否包含事务操作?

如果需要事务操作,则选择 InnoDB。没有事务操作的话,选择 MyISAM。

2. 是否存在并发写入和更新?

MyISAM 在并发写入和更新时的表现不佳,如果存在并发写入,选择 InnoDB。

3. 是否更注重查询效率,而写入和更新操作很少?

如果是,选择 MyISAM。

4. 是否需要全文索引?

如果不考虑第三方索引框架,如:elasticsearch的话,可以考虑使用 MyISAM。

上一篇 下一篇

猜你喜欢

热点阅读