区别 | innoDB | MyISAM |
mysql版本对存储引擎 |
5.5之后 | 5.5之前 |
索引 |
聚集索引 |
非聚集索引 |
锁 | 提供行锁(locking on row level),提供与 Oracle 类型一致的不加锁读取(non-locking read in SELECTs),另外,InnoDB 表的行锁也不是绝对的,如果在执行一个 SQL 语句时 MySQL 不能确定要扫描的范围,InnoDB 表同样会锁全表, 例如 update table set num=1 where name like "%aaa%" | 只支持表级锁 |
事务 | 支持事务 | 不支持事务 |
外键 | 支持外键 | 不支持外键 |
数据库文件 | innodb属于索引组织表,innodb有两种存储方式,共享表空间存储和多表空间存储,两种存储方式的表结构和myisam一样,以表名开头,扩展名是.frm。 | myisam属于堆表myisam在磁盘存储上有三个文件,每个文件名以表名开头,扩展名指出文件类型。1:.frm 用于存储表的定义2:.MYD 用于存放数据3:.MYI 用于存放表索引。myisam表还支持三种不同的存储格式:1:静态表(默认,但是注意数据末尾不能有空格,会被去掉)2:动态表3:压缩表 |
AUTO_INCREMENT | 如果你为一个表指定 AUTO_INCREMENT 列,在数据词典里的 InnoDB 表句柄包含一个名为自动增长计数器的计数器,它被用在为该列赋新值。自动增长计数器仅被存储在主内存中,而不是存在磁盘上.关于该计算器的算法实现,请搜索AUTO_INCREMENT 列在 InnoDB 里如何工作。 | 每表一个 AUTO_INCREMEN列的内部处理。MyISAM 为 INSERT 和 UPDATE 操作自动更新这一列。这使得 AUTO_INCREMENT 列更快(至少10%)。在序列顶的值被删除之后就不能再利用(当 AUTO_INCREMENT 列被定义为多列索引的最后一列,可以出现重使用从序列顶部删除的值的情况)。AUTO_INCREMENT 值可用 ALTERTABLE 或 myisamch 来重置对于 AUTO_INCREMENT 类型的字段,InnoDB 中必须包含只有该字段的索引,但是在 MyISAM 表中,可以和其他字段一起建立联合索引更好和更快的 auto_increment 处理 |
主键 | innodb引擎如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),innodb的数据是主索引的一部分,附加索引保存的是主索引的值。 | myisam允许没有任何索引和主键的表存在,myisam的索引都是保存行的地址。 |
统计条数 | 没有保存表的总行数,如果使用select count(*) from table;就会遍历整个表,消耗相当大 | 保存有表的总行数,如果select count(*) from table;会直接取出出该值 |
全文索引 | 不支持FULLTEXT类型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。(sphinx 是一个开源软件,提供多种语言的API接口,可以优化mysql的各种查询) | 支持 FULLTEXT类型的全文索引 |
索引保存位置 | innodb的索引和数据一起保存在表空间里。 | myisam的索引以表名+.MYI文件分别保存。 |
SELECT UPDATE INSERT Delete操作 | 如果执行大量的 SELECT,MyISAM 是更好的选择 | 1.如果你的数据执行大量的 INSERT 或 UPDATE,出于性能方面的考虑,应该使用 InnoDB 表。2.DELETE FROM table时,InnoDB 不会重新建立表,而是一行一行的删除。3.LOAD TABLE FROM MASTER 操作对 InnoDB 是不起作用的,解决方法是首先把 InnoDB 表改成 MyISAM 表,导入数据后再改成 InnoDB 表,但是对于使用的额外的 InnoDB 特性(例如外键)的表不适用。 |
图1
图2
图3
图4
参考:https://www.cnblogs.com/y-rong/p/8110596.html
参考:https://www.guhei.net/post/jb3076