InnoDB还是MyISAM 再谈MySQL存储引擎的选择

  两种类型最主要的差别就是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的,活跃用户20多万时候,也是很轻松应付了,因此我个人也是很喜欢Innodb的,只是如果从数据库平台应用出发,我还是会首选MyISAM。

  另外,可能有人会说你MyISAM无法抗太多写操作,但是我可以通 过架构来弥补,说个我现有用的数据库平台容量:主从数据总量在几百T以上,每天十多亿 pv的动态页面,还有几个大项目是通过数据接口方式调用未算进pv总数,(其中包括一个大项目因为初期memcached没部署,导致单台数据库每天处理 9千万的查询)。而我的整体数据库服务器平均负载都在0.5-1左右。

原文发布时间为:2011-06-22

时间: 2024-10-15 02:50:10

InnoDB还是MyISAM 再谈MySQL存储引擎的选择的相关文章

MySQL存储引擎的选择

一般而言,有InnoDB就差不多了,在大部分情况下,InnoDB就能满足我们的日常需求,所以在MySQL 5.5 之后,InnoDB就作为了默认的存储引擎.也就是说除了某些特征InnoDB没法提供,我们才有可能去选择其他的引擎. 事务 如果要用到事务,那么InnoDB就是不二之选,至少目前是这样的.由于MyISAM不支持事务,所以如果不需要事务,主要就是查询,插入等操作,那么也可以用MyISAM. 备份 在很多情况下,我们是在应用还在运行的情况下对数据进行备份的,所以如果在这种情况下,InnoD

浅谈MySQL存储引擎选择 InnoDB与MyISAM的优缺点分析_Mysql

下面先让我们回答一些问题: ◆你的数据库有外键吗? ◆你需要事务支持吗? ◆你需要全文索引吗? ◆你经常使用什么样的查询模式? ◆你的数据有多大? 思考上面这些问题可以让你找到合适的方向,但那并不是绝对的.如果你需要事务处理或是外键,那么InnoDB 可能是比较好的方式.如果你需要全文索引,那么通常来说 MyISAM是好的选择,因为这是系统内建的,然而,我们其实并不会经常地去测试两百万行记录.所以,就算是慢一点,我们可以通过使用Sphinx从InnoDB中获得全文索引. 数据的大小,是一个影响你

Mysql存储引擎InnoDB和Myisam的六大区别

 这篇文章主要介绍了Mysql存储引擎InnoDB和Myisam的六大区别,本文从构成上.事务处理.SQL操作.自动ID.表行数等方面讲解了它的区别,需要的朋友可以参考下       MyISAM InnoDB 构成上的区别:     每个MyISAM在磁盘上存储成三个文件.第一个文件的名字以表的名字开始,扩展名指出文件类型.   .frm文件存储表定义. 数据文件的扩展名为.MYD (MYData). 索引文件的扩展名是.MYI (MYIndex).   基于磁盘的资源是InnoDB表空间数据

MySQL存储引擎MyISAM与InnoDB的9点区别_Mysql

虽然MySQL里的存储引擎不只是MyISAM与InnoDB这两个,但常用的就是它俩了.可能有站长并未注意过MySQL的存储引擎,其实存储引擎也是数据库设计里的一大重要点,那么博客系统应该使用哪种存储引擎呢?下面我们分别来看两种存储引擎的区别. MySQL存储引擎MyISAM与InnoDB的区别 一.InnoDB支持事务,MyISAM不支持,这一点是非常之重要.事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而MyISAM就不可以了. 二.MyISAM适合查询以及插入为主的

《MySQL技术内幕:InnoDB存储引擎第2版》——1.3 MySQL存储引擎

1.3 MySQL存储引擎 通过1.2节大致了解了MySQL数据库独有的插件式体系结构,并了解到存储引擎是MySQL区别于其他数据库的一个最重要特性.存储引擎的好处是,每个存储引擎都有各自的特点,能够根据具体的应用建立不同存储引擎表.对于开发人员来说,存储引擎对其是透明的,但了解各种存储引擎的区别对于开发人员来说也是有好处的.对于DBA来说,他们应该深刻地认识到MySQL数据库的核心在于存储引擎. 由于MySQL数据库的开源特性,用户可以根据MySQL预定义的存储引擎接口编写自己的存储引擎.若用

mysql dba系统学习(21)mysql存储引擎InnoDB

mysql存储引擎InnoDB 1,主体系结构: 默认7个后台线程,4个io thread(insert buffer.log.read.write),1个master thread(优先级最高),1个锁(lock)监控线程,1个错误监控线程.可以通过show engine innodb status来查看.新版本已对默认的read thread和write thread分别增大到4个,可通过show variables like 'innodb_io_thread%'查看. 存储引擎组成: 缓

Mysql存储引擎MyISAM的常见问题(表损坏、无法访问、磁盘空间不足)_Mysql

本文为大家分享了解决Mysql存储引擎MyISAM常见问题的方法,供大家参考,具体内容如下 一.处理MyISAM存储引擎的表损坏 在使用MySQL,可能会遇到过MyISAM存储引擎的表损坏的情况.如以下情况: .frm被锁定不能修改 找不到.myi文件(索引文件) 意外结束记录 文件被毁坏 从表处理器得到错误nnn 解决办法1: 使用MySQL自带的myisamchk工具进行修复 打开bin目录,可以看到该工具   命令如下 myisamchk -r tablename r代表recover 或

mysql dba系统学习(20)mysql存储引擎MyISAM

mysql存储引擎MyISAM 1,创建myisam表 mysql> create table t (id int , name varchar(30) , msg varchar(100)) engine = MyISAM; mysql> show table status like "t" \G ; *************************** 1. row *************************** Name: t Engine: MyISAM

基于Mysql存储引擎的深入分析_Mysql

MySQL有很多种存储引擎,针对不同的应用,可以为每张表选择合适的存储引擎,这样有助于提升MySQL性能.创建新闻表news: 复制代码 代码如下: CREATE  TABLE `sandbox`.`news` (      `id` INT NOT NULL AUTO_INCREMENT ,      `name` VARCHAR(45) NULL ,          `content` VARCHAR(45) NULL ,      `created` VARCHAR(45) NULL ,