myisam和innodb的区别
1. 存储结构:
MyISAM:(文件名以表名开始)
.frm文件存储表定义
.MYD文件存储数据
.MYI文件存储索引
采用非聚簇索引,所以数据文件和索引文件是分开的,辅助索引和主键索引是一样的,不需要保证唯一性
存储表的总行数
InnoDB:
所有的表保存在同一个(也可能多个)数据文件中,表的大小仅受限于操作系统文件的大小,一般为2GB
采用聚簇索引,数据和索引存储在一起的,采用B+树的数据结构,每次查询需要按叶子节点去查询数据,对于范围查询选择自增主键相对友好
不记录表的总行数
2. 存储空间:
MyISAM:
可被压缩,存储空间较小。支持三种不同的存储格式:静态表、动态表、压缩表
默认为静态表,数据末尾不能有空格,否则会将空格去掉
InnoDB:
更多的内存和存储空间。在内存中建立专用的缓冲池用于高速缓冲数据与索引
3. 可移植性、备份与恢复:
MyISAM:以文件形式存储,转移方便。可单独针对某个表进行备份与恢复。
InnoDB:相对痛苦
4. 事务支持:
MyISAM:不支持事务
InnoDB:支持事务ACID
5. Auto-Increment:
MyISAM:自增长列必须为索引
InnoDB:同样,但要求若是组合索引,自增长列必须为第一列
6. 表锁:
MyISAM:表级锁
InnoDB:行级锁,大大提高并行性
7. 全文索引:
MyISAM:支持FULLTEXT
InnoDB:本身不支持FULLTEXT,用sphinx插件后支持效果更好
8. 表主键:
MyISAM:允许没有任何索引和Key的表存在
InnoDB:不允许。若没有索引则自动生成一个6字节的索引(按照本人的理解是:行级锁加载索引上)
9. 表的具体行数:
MyISAM:保存总行数,select count(*) from <table>;会取出该值
InnoDB:不保存总行数,select count(*) from <table>;会遍历表,高能耗
若加了where语句之后,二者相同
10. CURD:
MyISAM:select语句的最好选择
InnoDB:insert与update性能好,delete语句在InnoDB上效果更优,但是delete from <table>;语句InnoDB会进行逐行删除,最好改用truncate <table>
11. 外键FK:
MyISAM:不支持
InnoDB:支持