MySQL 存储引擎

MySQL 存储引擎

01)InnoDB
	适合数据增删改查
02)MyISAM
	一般存储一些只读的数据
03)MEMORY
	支持 HASH 索引
04)ARCHIVE
05)FEDERATED
06)EXAMPLE
07)BLACKHOLE
08)MERGE
09)NDBCLUSTER
10)CSV

# 其他存储引擎:
1.perconaDB:XTRADB
2.mariaDB

#查看存储引擎
mysql> show engines;

InnoDB 和 MyISAM 存储引擎对比

存储构成

# MyISAM 存储引擎,数据文件
-rw-rw---- 1 mysql mysql  10684 7月   9 15:10 user.frm		# Frame,表结构
-rw-rw---- 1 mysql mysql    980 7月  15 09:14 user.MYD		# MyData,表数据
-rw-rw---- 1 mysql mysql   2048 7月  15 09:28 user.MYI		# MyIndex,索引

# InnoDB 存储引擎,数据文件
-rw-rw---- 1 mysql mysql   8710 7月  17 10:59 city.frm		# Frame,表结构
-rw-rw---- 1 mysql mysql 950272 7月  17 10:59 city.ibd		# InnoDBData,表数据、索引

事务处理

MyISAM 类型的表强调性能,执行速度比 InnoDB 快(因为没有事务自动提交机制),但不提供事务处理的支持

InnoDB 类型的表支持事务,行级锁,外部键(foreign key)等高级数据库功能,InnoDB 的 AUTOCOMMIT 默认是打开的,即每条 SQL 语句会默认被封装成一个事务,自动提交,这样会影响速度,所以最好是把多条 SQL 语句显示放在 Begin 和 Comit 之间,组成一个事务去提交,防止多次提交导致的开销,大大提高性能

-- 查看 MySQL 支持的存储引擎 
-- mysql> SHOW ENGINES;
mysql> SELECT * FROM information_schema.ENGINES WHERE ENGINE = 'InnoDB' OR ENGINE = 'MyISAM';
+--------+---------+------------------------------------------------------------+--------------+------+------------+
| ENGINE | SUPPORT | COMMENT                                                    | TRANSACTIONS | XA   | SAVEPOINTS |
+--------+---------+------------------------------------------------------------+--------------+------+------------+
| MyISAM | YES     | MyISAM storage engine                                      | NO           | NO   | NO         |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES          | YES  | YES        |
+--------+---------+------------------------------------------------------------+--------------+------+------------+
2 rows in set (0.00 sec)

锁的级别

MyISAM 只支持表级锁,MyISAM不适合于有大量查询和修改并存的情况,那样查询进程会长时间阻塞。因为MyISAM是锁表,所以某项读操作比较耗时会使其他写进程饿死

InnoDB 提供行级锁(row-level locking),提供与 Oracle 类型一致的不加锁读取(non-locking read in
SELECTs)。也就是说适合大量查询与修改并存的情况 ,另外,InnoDB 表的行级锁也不是绝对的,如果在执行一个 SQL 语句时 MySQL 不能确定要扫描的范围,InnoDB表同样会锁全表, 例如 update table set num=1 where name like "%aaa%"

索引差异

MyISAM:支持全文(FULLTEXT)索引
InnoDB:不支持全文(FULLTEXT)索引,但是 InnoDB 可以使用 sphinx 插件支持全文索引,并且效果更好

另外,MyISAM 索引和数据分离,InnoDB 在一起,MyISAM 是非聚簇索引,InnoDB 的数据文件(IBD文件)本身就是主键索引文件,这样的索引被称为聚簇索引

MyISAM 缓存在内存的是索引,不是数据,而 InnoDB 缓存在内存的是数据,相对来说,服务器内存越大,InnoDB 发挥的优势越大。

CRUD 操作

MyISAM:如果执行大量的SELECT,MyISAM是更好的选择。
InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。DELETE 从性能上InnoDB更优,但DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除,在innodb上如果要清空保存有大量数据的表,最好使用truncate table这个命令。

默认设定主键

MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址
InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。InnoDB 的主键范围更大,最大是 MyISAM 的2倍。

AUTO_INCREMENT 前提条件

MyISAM 引擎的自动增长列必须是索引,MyISAM 中必须包含该字段的索引,如果是组合索引,自动增长可以不是第一列,他可以根据前面几列进行排序后递增
InnoDB 引擎的自动增长列必须是索引,InnoDB 中必须包含该字段的索引,如果是组合索引也必须是组合索引的第一列

简单总结(转载

MyISAM

每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。

MyISAM表格可以被压缩,而且它们支持全文搜索。不支持事务,而且也不支持外键。如果事物回滚将造成不完全回滚,不具有原子性。在进行updata时进行表锁,并发量相对较小。如果执行大量的SELECT,MyISAM 是更好的选择。

MyISAM的索引和数据是分开的,并且索引是有压缩的,内存使用率就对应提高了不少。能加载更多索引,而Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会造成Innodb比MyISAM体积庞大不小

MyISAM缓存在内存的是索引,不是数据。而InnoDB缓存在内存的是数据,相对来说,服务器内存越大,InnoDB发挥的优势越大。

优点:查询数据相对较快,适合大量的select,可以全文索引

缺点:不支持事务,不支持外键,并发量较小,不适合大量 update

InnoDB

这种类型是事务安全的。.它与BDB类型具有相同的特性,它们还支持外键。InnoDB表格速度很快。具有比BDB还丰富的特性,因此如果需要一个事务安全的存储引擎,建议使用它。在update时表进行行锁,并发量相对较大。如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。

优点:支持事务,支持外键,并发量较大,适合大量 update

缺点:查询数据相对较快,不适合大量的 select

对于支持事物的 InnoDB 类型的表,影响速度的主要原因是 AUTOCOMMIT 默认设置是打开的,而且程序没有显式调用BEGIN 开始事务,导致每插入一条都自动 Commit,严重影响了速度。可以在执行 sql 前调用 Begin,多条 sql 形成一个事物(即使 autocommit 打开也可以),将大大提高性能。

其他细节区别

1.InnoDB不支持FULLTEXT类型的索引。

2.InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table 时,InnoDB 要扫描一遍整个表来计算有多少行,但是 MyISAM 只要简单的读出保存好的行数 即可。注意的是,当 count(*) 语句包含 where 条件时,两种表的操作是一样的。

3.对于 AUTO_INCREMENT 类型的字段,InnoDB 中必须包含该字段的索引(若是联合索引必须是首位),但是在 MyISAM 中必须包含该字段的索引,但若是联合索引不必须是首位

4.DELETE FROM table 时,InnoDB 不会重新建立表,而是一行一行的删除,在 InnoDB 上如果要清空保存有大量数据的表,最好使用 truncate table 命令

5.LOAD TABLE FROM MASTER 操作对 InnoDB 是不起作用的,解决方法是首先把 InnoDB 表改成 MyISAM 表,导入数据后再改成 InnoDB 表,但是对于使用的额外的 InnoDB 特性(例如外键)的表不适用

其他知识点:

不是递增的主键会使得插入的速度很慢,例如使用手机号或身份证号做为主键,所以善用 AUTO_INCREMENT

表大不可怕,可怕的是count或者高偏移limit,可以将大的 limit big 换成 limit max_id, xxxxx

记录成长过程
原文地址:https://www.cnblogs.com/zzzwqh/p/13347508.html