• MySQL存储引擎之Myisam和Innodb总结性梳理-转


     原文链接:https://www.cnblogs.com/kevingrace/p/5685355.html 谢谢楼主

    Mysql有两种存储引擎:InnoDB与Myisam,下表是两种引擎的简单对比

      MyISAM InnoDB



    构成上的区别:
    每个MyISAM在磁盘上存储成三个文件。第一个 文件的名字以表的名字开始,扩展名指出文件类型。
    .frm文件存储表定义。
    数据文件的扩 展名为.MYD (MYData)。
    索引文件的扩 展名是.MYI (MYIndex)。
    基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB 表的 大小只受限于操作系统文件的大小,一般为 2GB

    事务处理上方面
    :
    MyISAM类型的表强调的是性能,其执行数 度比InnoDB类型更快,但是不提供事务支持 InnoDB提供事务支持事务,外部键等高级 数据库功能
     
     
     
     
     
     
     
     
    SELECT 
    UPDATE
    INSERT
    Delete









    如果执行大量的SELECT,MyISAM是更好的选择
    1.如果你的数据执行大量的INSERTUPDATE,出于性能方面的考虑,应该使用InnoDB表
    2.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的 删除。
    3.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用










    AUTO_INCREMENT的 操作
    每表一个AUTO_INCREMEN列的内部处理。
    MyISAMINSERTUPDATE操 作自动更新这一列。这使得AUTO_INCREMENT列更快(至少10%)。在序列顶的值被删除之后就不 能再利用。(当AUTO_INCREMENT列被定义为多列索引的最后一列, 可以出现重使用从序列顶部删除的值的情况)。
    AUTO_INCREMENT值可用ALTER TABLE或myisamch来重置

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

    更好和更快的auto_increment处理

    如果你为一个表指定AUTO_INCREMENT列,在数据词典里的InnoDB表句柄包含一个名为自动增长计数 器的计数器,它被用在为该列赋新值。

    自动增长计数 器仅被存储在主内存中,而不是存在磁盘上

    关于该计算器 的算法实现,请参考

    AUTO_INCREMENT列 在InnoDB里 如何工作



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












    表锁
    提供行锁(locking on row level),提供与 Oracle 类型一致的不加锁读取(non-locking read in
    SELECTs),另外,InnoDB表的行锁也不是绝对的,如果在执 行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”

    MySQL存储引擎MyISAM与InnoDB如何选择
    MySQL有多种存储引擎,每种存储引擎有各自的优缺点,可以择优选择使用:MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。
    虽然MySQL里的存储引擎不只是MyISAM与InnoDB这两个,但常用的就是两个。
    两种存储引擎的大致区别表现在:
    1)InnoDB支持事务,MyISAM不支持,这一点是非常之重要。事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而MyISAM就不可以了。
    2)MyISAM适合查询以及插入为主的应用,InnoDB适合频繁修改以及涉及到安全性较高的应用
    3)InnoDB支持外键,MyISAM不支持
    4)从MySQL5.5.5以后,InnoDB是默认引擎
    5)InnoDB不支持FULLTEXT类型的索引
    6)InnoDB中不保存表的行数,如select count(*) from table时,InnoDB需要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含where条件时MyISAM也需要扫描整个表
    7)对于自增长的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立联合索引
    8)清空整个表时,InnoDB是一行一行的删除,效率非常慢。MyISAM则会重建表
    9)InnoDB支持行锁(某些情况下还是锁整表,如 update table set a=1 where user like '%lee%'

    关于MyISAM与InnoDB选择使用:
    MYISAM和INNODB是Mysql数据库提供的两种存储引擎。两者的优劣可谓是各有千秋。INNODB会支持一些关系数据库的高级功能,如事务功能和行级锁,MYISAM不支持。MYISAM的性能更优,占用的存储空间少。所以,选择何种存储引擎,视具体应用而定:
    1)如果你的应用程序一定要使用事务,毫无疑问你要选择INNODB引擎。但要注意,INNODB的行级锁是有条件的。在where条件没有使用主键时,照样会锁全表。比如DELETE FROM mytable这样的删除语句。
    2)如果你的应用程序对查询性能要求较高,就要使用MYISAM了。MYISAM索引和数据是分开的,而且其索引是压缩的,可以更好地利用内存。所以它的查询性能明显优于INNODB。压缩后的索引也能节约一些磁盘空间。MYISAM拥有全文索引的功能,这可以极大地优化LIKE查询的效率。

    有人说MYISAM只能用于小型应用,其实这只是一种偏见。
    如果数据量比较大,这是需要通过升级架构来解决,比如分表分库,而不是单纯地依赖存储引擎。

    现在一般都是选用innodb了,主要是myisam的全表锁,读写串行问题,并发效率锁表,效率低myisam对于读写密集型应用一般是不会去选用的。

    关于Mysql数据库默认的存储引擎:
    MyISAM和InnoDB是MySQL的两种存储引擎。
    如果是默认安装,那就应该是InnoDB,你可以在my.cnf文件中找到default-storage-engine=INNODB;
    当然你可以在建表时指定相应的存储引擎。
    通过show create table xx 可以看见相应信息。

    Mysql中InnoDB和MyISAM的比较
    1)MyISAM:
    每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。
    MyISAM表格可以被压缩,而且它们支持全文搜索。不支持事务,而且也不支持外键。如果事物回滚将造成不完全回滚,不具有原子性。在进行updata时进行表锁,并发量相对较小。如果执行大量的SELECT,MyISAM是更好的选择。
    MyISAM的索引和数据是分开的,并且索引是有压缩的,内存使用率就对应提高了不少。能加载更多索引,而Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会造成Innodb比MyISAM体积庞大不小
    MyISAM缓存在内存的是索引,不是数据。而InnoDB缓存在内存的是数据,相对来说,服务器内存越大,InnoDB发挥的优势越大。

    优点:查询数据相对较快,适合大量的select,可以全文索引。
    缺点:不支持事务,不支持外键,并发量较小,不适合大量update

    2)InnoDB:(参数说明:Mysql存储引擎之Innodb重要参数说明
    这种类型是事务安全的。.它与BDB类型具有相同的特性,它们还支持外键。InnoDB表格速度很快。具有比BDB还丰富的特性,因此如果需要一个事务安全的存储引擎,建议使用它。在update时表进行行锁,并发量相对较大。如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。
    优点:支持事务,支持外键,并发量较大,适合大量update
    缺点:查询数据相对较快,不适合大量的select
    对于支持事物的InnoDB类型的表,影响速度的主要原因是AUTOCOMMIT默认设置是打开的,而且程序没有显式调用BEGIN 开始事务,导致每插入一条都自动Commit,严重影响了速度。可以在执行sql前调用begin,多条sql形成一个事物(即使autocommit打开也可以),将大大提高性能。

    基本的差别为:
    MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。
    MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。

  • 相关阅读:
    Java实现 LeetCode 242 有效的字母异位词
    Java实现 LeetCode 212 单词搜索 II
    Java实现 LeetCode 212 单词搜索 II
    Java实现 LeetCode 212 单词搜索 II
    Java实现 LeetCode 212 单词搜索 II
    Java实现 LeetCode 344 反转字符串
    Java实现 洛谷 P1208 [USACO1.3]混合牛奶 Mixing Milk
    Java实现 洛谷 P1208 [USACO1.3]混合牛奶 Mixing Milk
    Java实现 洛谷 P1208 [USACO1.3]混合牛奶 Mixing Milk
    Java实现 洛谷 P1208 [USACO1.3]混合牛奶 Mixing Milk
  • 原文地址:https://www.cnblogs.com/iyoume2008/p/8260659.html
Copyright © 2020-2023  润新知