存储引擎
Mysql 存储引擎 MYISAM 与 INNODB 区别
存储引擎Storage engine:Mysql中的数据、索引以及其他对象是如何存储的,是一套文件系统的实现。
常用的存储引擎有以下:
- INNODB引擎:INNODB引擎提供了对数据库ACID事务的支持。并且还提供了行级锁和外键的约束。它的设计的目标就是处理大数据容量的数据库系统。
- MYISAM引擎(原来Mysql的默认引擎):不提供事务的支持,也不支持行级锁和外键。
- MEMORY引擎:所有的数据都在内存中,数据的处理非常快,但是安全性不高。
MYISAM 与 INNODB的区别
| MYISAM | INNODB | |
|---|---|---|
| 存储结构 | 每张表被存放在三个文件:frm-表格定义、MYD(MYData)-数据文件、MYI(MYIndex)-索引文件 | 所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),INNODB表的大小只受限于操作系统文件的大小,一般为2GB |
| 存储空间 | MYISAM可被压缩,存储空间较小 | INNODB需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引 |
| 可移植性、备份及恢复 | 由于MYISAM的数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作 | 免费的方案可以拷贝数据文件、备份binlog,或者用mysqldump,在数据量达到几十G的时候就相对痛苦了 |
| 文件格式 | 数据和索引是分别存储的,数据.MYD,索引.MYI | 数据和索引是集中存储的.ibd |
| 记录存储顺序 | 按记录插入顺序保存 | 按照主键大小有序插入 |
| 外键 | 不支持 | 支持 |
| 事务 | 不支持 | 支持 |
| 锁支持(锁是避免资源争用的一个机制,Mysql锁对用户几乎是透明的) | 表级锁定 | 行级锁、表级锁,锁力度小并发能力高 |
| SELECT | MYISAM更优 | / |
| INSERT、UPDATE、DELEET | / | INNODB更优 |
| SELECT( * ) | MYISAM更快,因为MYISAM内部维护了一个计数器,可以直接调取。 | 支持 |
| 索引的实现方式 | B+树索引,MYISAM是堆表 | B+树索引,INNODB是索引组织表 |
| 哈希索引 | 不支持 | 支持 |
| 全文索引 | 支持 | 不支持 |
MYISAM 索引和 INNODB 索引的区别?
- INNODB索引是聚簇索引,MYISM索引是非聚簇索引。
- INNODB的主键索引的叶子节点存储着行数据,因此主键索引非常高效。
- MYISAM索引的叶子节点存储的是行数据地址,需要再寻址一次才能得到数据。
- INNODB的非主键索引的叶子节点存储的是主键和其他带索引的列数据,因此查询时做到覆盖索引会非常高效。
INNODB引擎的4大特性
- 插入缓冲(insert buffer)
- 二次写(double write)
- 自适应哈希索引(ahi)
- 预读(read ahead)
存储引擎选择
- 如果没有特别的需求,使用默认的
INNODB即可。 - MYISAM:以读写插入为主的应用程序,比如博客系统、新闻门户网站。
- INNODB:更新(删除)操作频率高,或者要保证数据的完整性;并发量高,支持事务和外键。比如OA自动化办公系统。