MySQL数据库引擎对比不断完善中

虽然标题是MySQL的数据库引擎对比
但是只对比最具代表性的
MyISAM和InnoDB

1、最明显的区别

    InnoDB支持事务处理,而MyISAM不支持
   
InnoDB支持行级锁,而MyISAM只支持表锁
    InnoDB支持外键,而MyISAM不支持
   
    既然如此,那MyISAM还有啥存在的必要?

    MyISAM的优势在于能够提供比InnoDB更快速的“查询”功能。
    毕竟,很多表都是写少读多。

    很多资料说,MyISAM是MySQL的默认引擎
    我觉得这么说不合适
    一
是默认引擎是可以设置的
    二
是因为我的MySQL默认引擎是InnoDB,好像我也没改过这个配置

2、文件结构

    MyISAM的表有三个文件 .frm .myd .myi
    分别是表定义文件、数据文件和索引文件。
   
    InnoDB是两个文件,一个数据文件和一个日志文件。

    如果只从这点考虑,MyISAM的insert和update性能不如InnoDB。
    事实上也确实如此
    我没有做过实验对比。需要update的表,
一般都需要事务支持,那只能用InnoDB。

3、增删查改

    对于增,即Insert,InnoDB速度快一些。

    对于删,即Delete,两者相差不大。
        有个例外,对于delete from user_info; 这种整表删除,
        MyISAM是表文件后再重新创建,而InnoDB是一行一行删除记录。
        O(1) 与 O(n)的区别。


    对于查,即select,MyISAM要快很多,这是MyISAM的杀手锏。
        传统的web应用,都是写少读多,那么正式MyISAM的用武之地。
        再举一个O(1) 对 O(n)的例子:
        由于MyISAM中存储表的行数
        因此 select count(*) from user_info; 这种命令执行很快
        而InnoDB查询统计表中记录条数。
   
    对于改,即Update,InnoDB速度更快,支持事务和行级锁。
    因此,MyISAM完败

4、锁

    MyISAM只支持表锁,不支持行锁
    因此,在并发更新时,效率比InnoDB低很多

   
    当然,并不是每次更新的效率都低很多
    在InnoDB中,对于 update user_info set age = 26 where user_name like '%tom%';
    这种无法确定更新范围的语句,依然要锁整个表

5、auto_increment

    在InnoDB中,如果一个字段被设置为auto_increment
    那么这个表必须有一个索引,这个索引只包含这一个字段
    这虽然是一个限制条件,但是一般很少遇到
    因为大部分情况下,设为auto_increment的字段都是唯一主键

    另外,MyISAM的auto_increment的效率要比InnoDB高 (10%左右)
    遇到过很多次,insert时数据库报错说重复主键
    之间一家公司,自己写了个服务替代MySQL的auto_increment
    也有用UUID最为主键的,这样最简单,不过检索效率低些。
    因此,MyISAM能高10%,也是一个不错的优势

6、总结

    对于需要事务处理的表,乖乖使用InnoDB吧。
    对于需要并发更新的表,还是乖乖使用InnoDB吧。
    
    对于另外的情况,
    如果是写多读少的表,那么还是使用InnoDB吧。

    如果是写少读多的表,尽量使用MyISAM,这正是MyISAM被设计出来的目的。

原文地址:https://www.cnblogs.com/hancf/p/2658361.html