导航

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:支持

 

 

posted on 2022-01-31 15:07  dogDan  阅读(75)  评论(0编辑  收藏  举报