zoukankan      html  css  js  c++  java
  • mysql 存储引擎 innodb和myISAM(转)

    mysql5.5+的版本默认引擎都是InnoDB,早期的Mysql版本默认的存储引擎是myISAM

    innodb:

    1.事务操作
    2.外键操作
    3.行级锁,这是当有where条件的时候。没有where时,不知道在那一个范围进行搜索时,也是表锁.提供和 Oracle 一样的一致性的不加锁读取,能增加并发读的用户数量并提高性能,不会增加锁的数量。
    4.写的速度快,这是建立在索引的更新操作上

    5.InnoDB 的设计目标是处理大容量数据时最大化性能,它的 CPU 利用率是其他所有基于磁盘的关系数据库引擎中最有效率的,在技术上,InnoDB 是一套放在 MySQL 后台的完整数据库系统,InnoDB 在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。 InnoDB 把数据和索引存放在表空间里,可能包含多个文件,这与其它的不一样,举例来说,在 MyISAM 中,表被存放在单独的文件中。InnoDB 表的大小只受限于操作系统的文件大小,一般为 2 GB。   
    InnoDB所有的表都保存在同一个数据文件 ibdata1 中(也可能是多个文件,或者是独立的表空间文件),相对来说比较不好备份,免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump。   

    myisam:

    1.表级锁
    2.读取速度快
    3.索引压缩更好
    4.更好和更快的auto_increment处理

    myISAM的一个缺陷是崩溃后无法安全恢复。

    MyISAM会将表存储在两个文件中:数据文件和索引文件,分别以.MYD和.MYI为扩展名

    COUNT() 在 MyISAM 表中会非常快,而在InnoDB 表下可能会很痛苦。而主键查询则在InnoDB下会相当相当的快,但需要小心的是如果我们的主键太长了也会导致性能问题。大批的inserts 语句在 MyISAM下会快一些,但是updates 在InnoDB 下会更快一些——尤其在并发量大的时候。

    myisam与innodb这两种引擎对索引的实现方式也不同。

    myiasm是使用B-树的结构来实现主码,非主码,唯一索引。

    innodb是使用B+树结构来实现主码,用B-树来实现非主码。

    以下是一些细节和具体实现的差别:

    1、InnoDB不支持FULLTEXT类型的索引。

    2、InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的。

    3、对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。

    4、DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。

    5、LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。

    6、MyISAM的索引和数据是分开的,并且索引是有压缩的,内存使用率就对应提高了不少。能加载更多索引,而Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会造成Innodb比MyISAM体积庞大不小。

    7、InnoDB表的行锁也不是绝对的,假如在执行一个SQL语句时mysql不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”

    使用两种的选择:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,
    应该使用InnoDB表。如果执行大量的SELECT,MyISAM是更好的选择。若需要使用事务处理,
    但是原来的数据表使用的是myisam,就需要改为bdb或者innodb,这样基于myisam的程序,
    将类型改为innodb后,其程序不用改动…… 综上所述,任何一种表都不是万能的,只有恰当的针对业务类型来选择合适的表类型,才能
    最大的发挥MySQL的性能优势。

    参考文献:http://www.cnblogs.com/myblog1314/archive/2013/06/05/3118370.html;

    http://blog.csdn.net/xifeijian/article/details/20316775

  • 相关阅读:
    Entity Framework+SQLite+DataBaseFirst
    接口的实现方式(显示和隐示)及协变和逆变
    C#线程
    UIScrollView放大缩小图片偏移的问题
    SQL Server 2008在添加用户时弹出错误提示:此版本的 Microsoft Windows 不支持 MUST_CHANGE 选项
    jmeter的正则表达式的使用
    Linux下安装jmeter
    系统测试方案
    [ASP.NET].NET逻辑分层架构总结
    [C#]C#时间日期操作
  • 原文地址:https://www.cnblogs.com/mingyao123/p/7360497.html
Copyright © 2011-2022 走看看