zoukankan      html  css  js  c++  java
  • 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被设计出来的目的。

  • 相关阅读:
    Lucence_Curd
    Lucence
    SpringMvc文件上传
    SpringMvc接收参数
    出现No qualifying bean of type [com.*.*.dao.InfoDao] found for :错误
    内连接、左外连接、右外连接、交叉连接区别
    html基础
    Java基础阶段综合练习
    java基础MySQL
    java基础IO删除文件夹文件
  • 原文地址:https://www.cnblogs.com/hancf/p/2658361.html
Copyright © 2011-2022 走看看