MySql技术内幕 - 体系结构
1.各个存储引擎的特点
- InnoDB:主要面向OLTP,支持行级锁,支持外键,支持非锁定读。通过MVCC支持高并发,利用next-key lock来解决幻读的问题。
- MyISAM:不支持事物,表锁,支持全文索引,主要适用于OLAP的场景。缓冲池只缓存索引文件,不缓存数据文件,数据文件的缓存则由操作系统本身来完成。
- NDB:是一个集群的存储引擎,特点是将数据都存储在内存中(从MySQL 5.1版本开始,可以将非索引数据存储在磁盘上),通过主键查找的速读非常快,但是NDB的链接操作是在Mysql数据库层去完成的,而不是在存储引擎层完成的,所以对于一些复杂的查询需要更多的网络开销。就是说一个客户端需要持有所有NDB节点的链接,如果一个查询需要从每一个节点都获取结果,那么就需要每一个链接都返回数据。
- Memory:将所有的数据都存放到内存中,默认的索引是哈希索引。只支持表锁,不支持text和blob类型。存储varchar的时候是按照char来处理的,会比较浪费存储空间。Mysql在处理临时表的时候是使用Memory的,但是如果中间结果的大小已经超过了大小限制,或者是存在text或者是blob类型的字段,则改为用MyISAM。但是MyISAM只缓存索引文件,所以在性能上可能会由损失。
MySQL各种引擎的对比:
| Feature | MyISAM | Memory | InnoDB | Archive | NDB |
|---|---|---|---|---|---|
| B-tree indexes | Yes | Yes | Yes | No | No |
| Backup/point-in-time recovery (note 1) | Yes | Yes | Yes | Yes | Yes |
| Cluster database support | No | No | No | No | Yes |
| Clustered indexes | No | No | Yes | No | No |
| Compressed data | Yes (note 2) | No | Yes | Yes | No |
| Data caches | No | N/A | Yes | No | Yes |
| Encrypted data | Yes (note 3) | Yes (note 3) | Yes (note 4) | Yes (note 3) | Yes (note 3) |
| Foreign key support | No | No | Yes | No | Yes (note 5) |
| Full-text search indexes | Yes | No | Yes (note 6) | No | No |
| Geospatial data type support | Yes | No | Yes | Yes | Yes |
| Geospatial indexing support | Yes | No | Yes (note 7) | No | No |
| Hash indexes | No | Yes | No (note 8) | No | Yes |
| Index caches | Yes | N/A | Yes | No | Yes |
| Locking granularity | Table | Table | Row | Row | Row |
| MVCC | No | No | Yes | No | No |
| Replication support (note 1) | Yes | Limited (note 9) | Yes | Yes | Yes |
| Storage limits | 256TB | RAM | 64TB | None | 384EB |
| T-tree indexes | No | No | No | No | Yes |
| Transactions | No | No | Yes | No | Yes |
| Update statistics for data dictionary | Yes | Yes | Yes | Yes | Yes |

浙公网安备 33010602011771号