MySQL存储引擎--MyISAM与InnoDB区别

  1. MySQL默认采用的是MyISAM。
  2. MyISAM不支持事务,而InnoDB支持。InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事务,自动提交,这样会影响速度,所以最好是把多条SQL语句显示放在begin和commit之间,组成一个事务去提交。
  3. InnoDB支持数据行锁定,MyISAM不支持行锁定,只支持锁定整个表。即MyISAM同一个表上的读锁和写锁是互斥的,MyISAM并发读写时如果等待队列中既有读请求又有写请求,默认写请求的优先级高,即使读请求先到,所以MyISAM不适合于有大量查询和修改并存的情况,那样查询进程会长时间阻塞。因为MyISAM是锁表,所以某项读操作比较耗时会使其他写进程饿死。
  4. InnoDB支持外键,MyISAM不支持。
  5. InnoDB的主键范围更大,最大是MyISAM的2倍。
  6. InnoDB不支持全文索引,而MyISAM支持。全文索引是指对char、varchar和text中的每个词(停用词除外)建立倒排序索引。MyISAM的全文索引其实没啥用,因为它不支持中文分词,必须由使用者分词后加入空格再写到数据表里,而且少于4个汉字的词会和停用词一样被忽略掉。
  7. MyISAM支持GIS数据,InnoDB不支持。即MyISAM支持以下空间数据对象:Point,Line,Polygon,Surface等。
  8. 没有where的count(*)使用MyISAM要比InnoDB快得多。因为MyISAM内置了一个计数器,count(*)时它直接从计数器中读,而InnoDB必须扫描全表。所以在InnoDB上执行count(*)时一般要伴随where,且where中要包含主键以外的索引列。为什么这里特别强调“主键以外”?因为InnoDB中primary index是和raw data存放在一起的,而secondary index则是单独存放,然后有个指针指向primary key。所以只是count(*)的话使用secondary index扫描更快,而primary key则主要在扫描索引同时要返回raw data时的作用较大。
  9. 对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
  10. .DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。

  11. LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。
  12. 另外,InnoDB表的行锁也不是绝对的,假如在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”
  13. 两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁。而MyISAM不支持.所以MyISAM往往就容易被人认为只适合在小项目中使用。

      作为使用MySQL的用户角度出发,Innodb和MyISAM都是比较喜欢的,如果数据库平台要达到需求:99.9%的稳定性,方便的扩展性和高可用性来说的话,MyISAM绝对是首选。

      原因如下:

      1、平台上承载的大部分项目是读多写少的项目,而MyISAM的读性能是比Innodb强不少的。

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

      3、经常隔1,2个月就会发生应用开发人员不小心update一个表where写的范围不对,导致这个表没法正常用了,这个时候MyISAM的优越性就体现出来了,随便从当天拷贝的压缩包取出对应表的文件,随便放到一个数据库目录下,然后dump成sql再导回到主库,并把对应的binlog补上。如果是Innodb,恐怕不可能有这么快速度,别和我说让Innodb定期用导出xxx.sql机制备份,因为最小的一个数据库实例的数据量基本都是几十G大小。

      4、从接触的应用逻辑来说,select count(*) 和order by 是最频繁的,大概能占了整个sql总语句的60%以上的操作,而这种操作Innodb其实也是会锁表的,很多人以为Innodb是行级锁,那个只是where对它主键是有效,非主键的都会锁全表的。

      5、还有就是经常有很多应用部门需要我给他们定期某些表的数据,MyISAM的话很方便,只要发给他们对应那表的frm.MYD,MYI的文件,让他们自己在对应版本的数据库启动就行,而Innodb就需要导出xxx.sql了,因为光给别人文件,受字典数据文件的影响,对方是无法使用的。

      6、如果和MyISAM比insert写操作的话,Innodb还达不到MyISAM的写性能,如果是针对基于索引的update操作,虽然MyISAM可能会逊色Innodb,但是那么高并发的写,从库能否追的上也是一个问题,还不如通过多实例分库分表架构来解决。

      7、如果是用MyISAM的话,merge引擎可以大大加快应用部门的开发速度,他们只要对这个merge表做一些select count(*)操作,非常适合大项目总量约几亿的rows某一类型(如日志,调查统计)的业务表。

      当然Innodb也不是绝对不用,用事务的项目就用Innodb的。另外,可能有人会说你MyISAM无法抗太多写操作,但是可以通过架构来弥补。

  14. mysql常识以及存储引擎,锁和事物 http://www.ahlinux.com/mysql/9800.html
  15. 存储引擎(表类型):

    InnoDB存储引擎:支持事务、回滚,主要面向OLTP,支持行锁设计、支持外键、支持类似Oracle的非锁定读。(mysql 5.5.8开始是默认存储引擎)数据放在一个独立的表空间、使用MVCC(多版本并发控制)、实现4种隔离级别,默认REPEATABLE级别、使用 netx-key locking避免幻读,还有插入缓冲、二次写、自适应哈希索引、预读等。采用聚集的方式,每张表都按主键的顺序进行存储。索引和数据是紧密捆绑的,没有 使用压缩从而会造成INNODB比MYISAM体积庞大不小。

    备注:使用场合:在承载的大部分项目执行insert 和update的话,应该选择InnoDB.

    优势:在于提供了良好的事务管理、崩溃、修复能力和并发控制,

    缺点:是其读写效率稍差,占用的数据空间相对比较大.

    Myisam存储引擎:不支持事务,表锁设计,支持全文索引,主要面向OLAP,在innodb以前是默认存储引擎,它的缓冲池只缓存索引文 件,而不缓存数据文件。索引和数据分开的,可以加载更多的索引,并且索引是压缩的,相对内存来说使用效率就提高不少,他使用一种表格锁定的机制,来优化多 个并发读写操作。MYISAM强调了快速读取操作。

    备注:使用场合:在承载的大部分项目是读多写少的项目平台中,而MyISAM的读性能是比Innodb强不少的

    优点:占用空间小,处理速度快,

    缺点: 不支持事务日志的完整性和并发性

    NDB存储引擎:集群存储引擎,类似于Oracle的RAC集群(share everything),其结构是share nothing集群结构。数据全部放在内存中,因此主键查找的速度极快,并能在线添加NDB存储数据节点,面向OLTP。貌似mysql集群企业应用不 多,因为技术和稳定性都不太成熟。

    Memory存储引擎:数据全部房子啊内存,数据库重启或崩溃,表中数据消失,适合存储OLTP应用临时表,也可以作为OLAP数据库应用的数据仓库的维度表,默认使用hash索引而不是B+索引。

    优点:存储速度快

    缺点:缺乏稳定性和完整性

    Infobright存储引擎:第三方存储引擎,存储按照列而非行的,故适合OLAP的数据库应用

    merge(mrg_myisam)存储引擎:一组myisam表的组合, 这些myisam表必须结构完全相同,使用merge表来透明地对多个表进行查询和更新操作

    NTSE存储引擎:网易开发面向内部使用的,目前不支持压缩、行级缓存等特性。

    BDB: 源自Berkeley DB,事务型表的另一种选择

    archive: 非常适合存储大量独立的、作为历史记录的数据, 它们不经常被读取, archive拥有高效的插入速度,但对查询的支持相对较差

    CSV: 逻辑上由逗号分割数据的存储引擎

    BlackHole: 黑洞引擎,写入的任何数据都会消失,一般用于记录binlog, 做复制的中继。

    等存储引擎!


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值