存储引擎 Storage engine: 如何存储数据,如何为存储的数据建立索引和如何更新、查询数据等技术方法的实现。
MySQL中常用的存储引擎有以下:
InnoDB 引擎: InnoDB 提供了对数据库事物的支持。并且还提供了行级锁和键的约束。它的设计目的是为了处理大数据容量的数据库系统;
MyISAM 引擎: 不提供事物的支持,也不支持行级锁和外键。
MEMORY 引擎: 所有数据都在内存里,数据的处理速度快,MySQL的内存表技术就是基于此引擎,但是数据安全性不高。
MySQL 5.5 版本之前 默认存储引擎是MyISAM,5.5之后默认存储引擎改为了InnoDB。
MyISAM适合查询以及插入的应用InnoDB适合频繁的修改以及涉及到安全性较高的应用它们主要有以下区别:
- InnoDB支持事务,MyISAM 不支持事务。
- InnoDB最小的锁粒度行级锁,MyISAM最小的锁粒度是表级锁。一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,因此并发访问受限。这也是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一;
- InnoDB支持外键,MyISAM 不支持。
- InnoDB索引是聚簇索引,MyISAM 是非聚簇索引。、
- InnoDB 在MySQL 5.6 之前 不支持(FULLTEXT) 全文索引
- InnoDB的叶子节点存储着行数据,因此主键索引非常高效 ,MyISAM 的叶子节点是存储的行数据地址 ,需要再一次寻址才能找到数据。
- MyISAM 可被压缩 存储空间较小。 InnoDB 的表需要更多内存和存储,它会在主内存中建立其专用的缓存池用于高速缓存数据和索引。
- MyISAM 的数据以文件形式存储在数据转移中比较方便。 InnoDB 免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump,在数据量达到几十G的时候就相对痛苦了。
- MyISAM保存有表的总行数,如果select count(*) from table;会直接取出出该值。
没有保存表的总行数(只能遍历),如果使用select count(*) from table;就会遍历整个表,消耗相当大,但是在加了wehre条件后,myisam和innodb处理的方式都一样。
如果没有特别需求,使用默认的InnoDB 就行了。