MySQL引擎特点

2020-04-05  本文已影响0人  李白开水

MyISAM存储引擎

表锁
MyISAM表有表级锁。注意不要让它成为瓶颈。

不支持自动数据恢复
如果MySQL服务器崩溃或掉电,就应该在使用之前进行检査和执行可能的修复。如果有大型表,这可能会花几个小时。

不支持事务
MyISAM表不支持事务。实际上, MyISAM甚至不保证单个命令会完成。如果在多行 UPDATE的中途有错误发生,一些行会被更新,而另外一些行则不会。

只有索引被缓存在内存中
MyISAM只缓存了 MySQL进程内部的索引,并保存在键缓冲区。操作系统缓存了表的数据,因此在MySQL5.0中须进行昂贵的系统调用来取得它。

紧密存储
行被紧紧地保存在一起,这样磁盘上的数捃就能得到小的磁盘占用和快速的全表扫描。

Memory存储引擎

表锁
和 My ISAM表一样, Memory表也有表锁。但这通常不是问题,因为 Memory表上的查询都较快。

不支持动态行
Memory表不支持动态(也就是可变长度)行,因此它们根本不支持BLOB和TEXT字段。即使 VARCHAR(5000)也会变成CHAR(5000)—如果大多数值较小,则是巨大的内存浪费。

哈希索引是默认索引类型
和其他存储引擎不同的是,如果不显式地定义,默认的索引类型是哈希类型。

没有索引统计
Memory表不支持索引统计,因此某些复杂的查询有可能会得到不好的执行计划。

重启后丢失数据
Memory表不会把任何数据持久到磁盘,因此,当服务器重启后即使表的定义还在,数据也会丢失。

InnoDB存储引擎

事务性
InnoDB支持事务和四种事务隔离级别。

外键
在 MySQL5.0中, InnoDB是唯一支持外键的存储引擎。另外的存储引擎在 CREATE TABLE命令中可以接受外键,但却不会强制执行。一些第三方引擎,比如 SolidDB,也在存储引擎层次支持它。 MySQL AB计划在未来添加服务器级别的支持。

行级锁
锁设定于行一级,不会向上传递并且也不会阻塞选择—标准选择根本不会设定任何锁,它有很好的并发特性。

多版本
InnoDB使用多版本并发控制,这样在默认情况下可能会选择读取陈旧的数据。事实上,它的MvCC架构增添了很多复杂的和意料之外的行为。如果使用 InnoDB,就应该仔细阅读 InnoDB手册。

按主键聚集
所有的 InnoDB表都是按主键聚集的,可以在架构设计中运用这一点。

所有索引包含主键列
索引按照主键引用行,因此,如果不把主键维持得很短,索引就增长得很大。

优化的缓存
InnoDB把数据和内存缓存在缓冲区池里。它也会自动构建哈希索引以加快行读取。

未压缩的索引
索引没有使用前缀压缩,因此可能会比 MyISAM表的索引大很多。

数据装载缓慢
在 MySQL5.0中, InnoDB不会特别优化数据加载。它一次构建一行的索引,而不是按照排序进行构建这会导致数据加载很慢。

阻塞 AUTO_INCREMENT
在 MySQL5.1之前的版本中, InnoDB使用了表级锁来产生每个新的 AUTO INCREMEN值。

没有缓存的 COUNT()值*
和 MyISAM表或 Memory表不同, InnoDB表不会把表的行数保存在表中,这意味着没有 WHERE子句的COUNT(*)查询不会被优化掉,并且需要全表或索引扫描。

上一篇 下一篇

猜你喜欢

热点阅读