引擎

先查看一下数据库有什么引擎吧

MariaDB [(none)]> show engines;
+--------------------+---------+----------------------------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                                          | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------------------------+--------------+------+------------+
| MRG_MyISAM         | YES     | Collection of identical MyISAM tables                                            | NO           | NO   | NO         |
| CSV                | YES     | Stores tables as CSV files                                                       | 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         |
| Aria               | YES     | Crash-safe tables with MyISAM heritage                                           | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, foreign keys and encryption for tables | YES          | YES  | YES        |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                                               | NO           | NO   | NO         |
| SEQUENCE           | YES     | Generated tables filled with sequential values                                   | YES          | NO   | YES        |
+--------------------+---------+----------------------------------------------------------------------------------+--------------+------+------------+

InnoDB

自从某个版本之后,InnoDB 就是 MariaDB 以及 MySQL 的默认存储引擎了,在这之前是 MyISAM。

InnoDB 使用行级锁,提供了具有提交、回滚和崩溃回复能力的事务安全。 支持自动增长列,支持外键约束,并发能力强,占用空间是 MYISAM 的 2.5 倍,处理效率相对会差一些。

一般来说,InnoDB 对于多数情况都是很不错的选择,能满足绝大多数的需要。

MyISAM

全表锁,拥有较高的执行速度,不支持事务,不支持外键,并发性能差,支持压缩,占用空间相对较小。 对事务完整性没有要求,以 select、insert 为主的应用基本上可以使用这引擎。

MRG_MyISAM

MRG_MyISAM 引擎是一组 MyISAM 表的组合,在 MySQL5.7 之前叫做 MEGER。

MEG_MyISAM 引擎需要主表 MERGE 和子表具有完全一样的数据结构(属性、数据类型、索引)。 对于存储策略是分成多表,如日志表,按照一年十二个月份划分,需要 12 张定义完全一样的数据表。 当联合多个月份的表查询数据时,需要写多个表的连接,这时使用 MEG_MyISAM 引擎只需要像对待一张表一样查询,对数据的操作就变得简单了。

MEMORY

MEMORY 使用全表锁,速度快,数据直接存储在内存中,但会占用和数据量成正比的内存空间。且数据在mysql重启时会丢失。 默认使用 HASH 索引,检索效率非常高,但不适用于精确查找,主要用于那些内容变化不频繁的代码表。

InnoDB 与 MyISAM 的区别

事务

InnoDB 支持事务,MyISAM 不支持。 InnoDB 默认把每一条 SQL 都封装成事务,这样会影响速度,所以最好把多条 SQL 组成一个事务。

外键

InnoDB 支持外键,MyISAM 不支持。 对一个包含外键的 InnoDB 表转为 MYISAM 会失败。

索引

InnoDB 是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。 但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。 因此,主键不应该过大,因为主键太大,其他索引也都会很大。

MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。

全表查询

InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。 MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快.

细节差异
  • InnoDB 不支持 FULLTEXT 类型的索引

  • 对于 AUTO_INCREMENT 类型的字段,InnoDB 中必须包含只有该字段的索引,但是在 MyISAM 表中,可以和其他字段一起建立联合索引

  • DELETE FROM table,InnoDB 不会重新建立表,而是一行一行的删除

  • InnoDB 的行锁不是绝对的,一个 SQL 语句不能确定要扫描的范围时会锁全表,例 update table set num=1 where name like “%aaa%”

怎样选择数据库引擎

特性InnoDBMyISAMMEMORY
储存限制64TBRAM
锁机制
外键✔️
事务✔️
B+ 树索引✔️✔️✔️
全文索引✔️✔️
哈希索引✔️✔️
集群索引✔️
数据缓存✔️-
索引缓存✔️✔️-
数据压缩✔️✔️-
储存消耗-
内存消耗-
批量写入

一般情况 InnoDB 和 MyISAM 都可以使用,深入一点的就看是否需要事务和外键来决定。

MyISAM 没办法抗并发写操作,不过可以通过架构来弥补的嘛。

都是看应用场景了,项目不大、没有什么大流量,没什么架构的,InnoDB 就够了。

powered by Gitbook该文件修订时间: 2020-04-10 10:05:54

results matching ""

    No results matching ""

    results matching ""

      No results matching ""