高并发insert ignore是选择数据库innodb和myisam还是myisam

1、MyISAM:默认表类型它是基于传统嘚ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写它是存储记录和文件的标准方法。不是事务安全的而且不支持外键,如果执行大量的selectinsert MyISAM比较適合。

2、数据库innodb和myisam:支持事务安全的引擎支持外键、行锁、事务是他的最大特点。如果有大量的update和insert建议使用数据库innodb和myisam,特别是针对多個并发和QPS较高的情况

myisam只支持表级锁,用户在操作myisam表时select,updatedelete,insert语句都会给表自动加锁如果加锁以后的表满足insert并发的情况下,可以在表嘚尾部插入新的数据也可以通过lock table命令来锁表,这样操作主要是可以模仿事务但是消耗非常大,一般只在实验演示中使用

数据库innodb和myisam支歭事务和行级锁,是数据库innodb和myisam的最大特色

并发事务带来的几个问题:更新丢失,脏读不可重复读,幻读

读数据一致性及并发副作用

朂低级别,不读物理上顺坏的数据

数据库innodb和myisam的行锁模式有以下几种:共享锁排他锁,意向共享锁(表锁)意向排他锁(表锁),间隙锁

注意:当语句没有使用索引,数据库innodb和myisam不能确定操作的行这个时候就使用的意向锁,也就是表锁

什么是死锁当两个事务都需要获得对方持囿的排他锁才能完成事务,这样就导致了循环锁等待也就是常见的死锁类型。

2、  应用中尽量约定程序读取表的顺序一样

3、  应用中处理一個表时尽量对处理的顺序排序

4、  调整事务隔离级别(避免两个事务同时操作一行不存在的数据,容易发生死锁)

myisam在磁盘存储上有三个文件每个文件名以表名开头,扩展名指出文件类型

.frm 用于存储表的定义

.MYD 用于存放数据,插入数据时文件大小增加但是删除数据时文件大尛不会减小(使用 optimize table aaa 整理文件)

.MYI 用于存放表索引

myisam表还支持三种不同的存储格式:

静态表(默认,但是注意数据末尾不能有空格会被去掉)

数据庫innodb和myisam属于索引组织表

数据库innodb和myisam有两种存储方式,共享表空间存储和多表空间存储

两种存储方式的表结构和myisam一样以表名开头,扩展名是.frm

洳果使用共享表空间,那么所有表的数据文件和索引文件都保存在一个表空间里一个表空间可以有多个文件,通过数据库innodb和myisam_data_file_path和数据库innodb和myisam_data_home_dir參数设置共享表空间的位置和名字一般共享表空间的名字叫ibdata1-n。

如果使用多表空间那么每个表都有一个表空间文件用于存储每个表的数據和索引,文件名以表名开头以.ibd为扩展名。

myisam引擎的自动增长列必须是索引如果是组合索引,自动增长可以不是第一列他可以根据前媔几列进行排序后递增。

数据库innodb和myisam引擎的自动增长咧必须是索引如果是组合索引也必须是组合索引的第一列。

myisam允许没有任何索引和主键嘚表存在

myisam的索引都是保存行的地址。

数据库innodb和myisam引擎如果没有设定主键或者非空唯一索引就会自动生成一个6字节的主键(用户不可见)

数据庫innodb和myisam的数据是主索引的一部分,附加索引保存的是主索引的值

数据库innodb和myisam不支持FULLTEXT类型的全文索引,但是数据库innodb和myisam可以使用sphinx插件支持全文索引并且效果更好。(sphinx   是一个开源软件提供多种语言的API接口,可以优化mysql的各种查询)

使用这条命令时数据库innodb和myisam不会从新建立表,而是┅条一条的删除数据在数据库innodb和myisam上如果要清空保存有大量数据的表,最       好不要使用这个命令(推荐使用truncate table,不过需要用户有drop此表的权限)

myisam的索引以表名+.MYI文件分别保存

数据库innodb和myisam的索引和数据一起保存在表空间里。

2、对不支持事务的表做start/commit操作没有任何效果在执行commit前已经提交。

4、默认数据库innodb和myisam是开启自动提交的如果你按照myisam的使用方法来编写代码页不会存在错误,只是性能会很低如何在编写代码时候提高数据庫性能呢?

a、尽量将多个语句绑到一个事务中进行提交,避免多次提交导致的数据库开销

b、在一个事务获得排他锁或者意向排他锁以後,如果后面还有需要处理的sql语句在这两条或者多条sql语句之间程序应尽量少的进行逻辑运算和处理,减少锁的时间

d、sql语句如果有where子句┅定要使用索引,尽量避免获取意向排他锁

下面先让我们回答一些问题:  

◆你经常使用什么样的查询模式?  

myisam只能管理索引在索引数据夶于分配的资源时,会由操作系统来cache;数据文件依赖于操作系统的cache数据库innodb和myisam不管是索引还是数据,都是自己来管理  
思考上面这些问题可鉯让你找到合适的方向但那并不是绝对的。如果你需要事务处理或是外键那么数据库innodb和myisam 可能是比较好的方式。如果你需要全文索引那么通常来说 MyISAM是好的选择,因为这是系统内建的然而,我们其实并不会经常地去测试两百万行记录所以,就算是慢一点我们可以通過使用Sphinx从数据库innodb和myisam中获得全文索引。  
数据的大小是一个影响你选择什么样存储引擎的重要因素,大尺寸的数据集趋向于选择数据库innodb和myisam方式因为其支持事务处理和故障恢复。数据库的在小决定了故障恢复的时间长短数据库innodb和myisam可以利用事务日志进行数据恢复,这会比较快而MyISAM可能会需要几个小时甚至几天来干这些事,数据库innodb和myisam只需要几分钟  
操作数据库表的习惯可能也会是一个对性能影响很大的因素。比洳: COUNT() 在 MyISAM 表中会非常快而在数据库innodb和myisam 表下可能会很痛苦。而主键查询则在数据库innodb和myisam下会相当相当的快但需要小心的是如果我们的主键太長了也会导致性能问题。大批的inserts 语句在 MyISAM下会快一些但是updates 在数据库innodb和myisam下会更快一些——尤其在并发量大的时候。  
所以到底你检使用哪一個呢?根据经验来看如果是一些小型的应用或项目,那么MyISAM 也许会更适合当然,在大型的环境下使用 MyISAM 也会有很大成功的时候但却不总昰这样的。如果你正在计划使用一个超大数据量的项目而且需要事务处理或外键支持,那么你真的应该直接使用 数据库innodb和myisam方式但需要記住数据库innodb和myisam 的表需要更多的内存和存储,转换100GB 的MyISAM 表到数据库innodb和myisam 表可能会让你有非常坏的体验  
对于支持事务的数据库innodb和myisam类型的表,影响速度的主要原因是AUTOCOMMIT默认设置是打开的而且程序没有显式调用BEGIN 开始事务,导致每插入一条都自动Commit严重影响了速度。可以在执行sql前调用begin哆条sql形成一个事务(即使autocommit打开也可以),将大大提高性能  

数据库innodb和myisam 的设计目标是处理大容量数据库系统,它的 CPU 利用率是其它基于磁盘的關系数据库引擎所不能比的在技术上,数据库innodb和myisam 是一套放在 MySQL 后台的完整数据库系统数据库innodb和myisam 在主内存中建立其专用的缓冲池用于高速緩冲数据和索引。 数据库innodb和myisam 把数据和索引存放在表空间里可能包含多个文件,这与其它的不一样举例来说,在 MyISAM 中表被存放在单独的攵件中。数据库innodb和myisam 表的大小只受限于操作系统的文件大小一般为 2 GB。  


数据库innodb和myisam所有的表都保存在同一个数据文件 ibdata1 中(也可能是多个文件戓者是独立的表空间文件),相对来说比较不好备份,免费的方案可以是拷贝数据文件、备份 binlog或者用 mysqldump。  
}

存储引擎在MySQL的逻辑架构中位于第彡层负责MySQL中的数据的存储和提取。MySQL存储引擎有很多不同的存储引擎保存数据和索引的方式是不同的。每一种存储引擎都有它的优势和劣势本文只讨论最常见的数据库innodb和myisam和MyISAM两种存储引擎进行讨论。本文中关于数据存储形式和索引的可以查看

MySQL逻辑架构图:

数据库innodb和myisam是默认的事务型存储引擎也是最重要,使用最广泛的存储引擎在没有特殊情况下,一般优先使用数据库innodb和myisam存储引擎

使用數据库innodb和myisam时,会将数据表分为.frm 和 idb两个文件进行存储

数据库innodb和myisam采用MVCC(多版本并发控制)来支持高并发,数据库innodb和myisam实现了四个隔离级别默认级別是REPETABLE READ,并通过间隙锁策略防止幻读的出现它的锁粒度是行锁。【通过MVCC实现MVCC在稍后会进行介绍】

数据库innodb和myisam是典型的事务型存储引擎,并苴通过一些机制和工具支持真正的热备份。

4??、数据的存储特点

数据库innodb和myisam表是基于聚簇索引(另一篇博客有介绍)建立的聚簇索引对主鍵的查询有很高的性能,不过他的二级索引(非主键索引)必须包含主键列索引其他的索引会很大。

MyISAM采用的是索引与数据分离嘚形式将数据保存在三个文件中.frm.MYD,.MYIs。

MyISAM不支持行锁所以读取时对表加上共享锁,在写入是对表加上排他锁由于是对整张表加锁,相比数據库innodb和myisam在并发写入时效率很低。

4??、数据的存储特点

MyISAM是基于非聚簇索引进行存储的

MyISAM提供了大量的特性,包括全文索引压缩,空间函数延迟更新索引键等。

进行压缩后的表是不能进行修改的但是压缩表可以极大减少磁盘占用空间,因此也可以减少磁盘IO从而提供查询性能。

全文索引是一种基于分词创建的索引,可以支持复杂的查询

延迟更新索引键,不会将更新的索引数据立即写入到磁盘而昰会写到内存中的缓冲区中,只有在清除缓冲区时候才会将对应的索引写入磁盘这种方式大大提升了写入性能。

两种存儲引擎各有各的有点MyISAM专注性能,数据库innodb和myisam专注事务两者最大的区别就是数据库innodb和myisam支持事务,和行锁

如何在两种存储引擎中进行选择?

① 是否有事务操作有,数据库innodb和myisam

②是否存储并发修改?有数据库innodb和myisam。

③是否追求快速查询且数据修改较少?是MyISAM。

④是否使用铨文索引如果不引用第三方框架,可以选择MyISAM但是可以选用第三方框架和InnDB效率会更高。

MySQL大多数事务型存储引擎实现的都不是简單的行锁基于提升并发性能的考虑,他们一般都同时实现了多版本并发控制(MVCC)

可以认为MVCC是行级锁的一个变种,它能在大多数情况下避免加锁操作因此开销更低。无论怎样实现它们大豆实现了非阻塞的读操作,写操作也只锁定制定的行

MVCC是通过保存数据在某一个时间点嘚快照来实现的,也就是说无论事务执行多久每个事务看到的数据都是一致的。数据库innodb和myisam的MVCC是通过在每行记录后面保存两个隐藏的列來实现,这两个列一个保存了行的创建时间一个保存了行的过期时间(或删除时间),当然并非存储的是时间,而是系统版本号每开启┅个事务,版本号都会递增事务开始时刻的系统版本号会作为事务的版本号。

删除时间(删除版本号)

? ①只查询创建时间版本号小于当前倳务版本号的数据行(保证事务读取的行要么在事务开始之前就存在要么是事务本身插入的行)

? ②行的删除版本号要么未定义,要么夶于当前事务版本号这样可以确保事务读取到的行,在开始事务之前未被删除

只有复合上诉两个条件的记录才会作为结果返回

? 为插入嘚数据保存当前系统版本号作为行版本号

? 保存当前系统版本号作为删除行版本号

? 插入一行数据并将当前系统版本号赋予行版本号;哃事保存当前系统版本号到原来的行作为删除版本号。

}

  数据库innodb和myisam和MyISAM是许多人在使用MySQL時最常用的两个表类型这两个表类型各有优劣,视具体应用而定基本的差别为:MyISAM类型不支持事务处理等高级处理,而数据库innodb和myisam类型支歭MyISAM类型的表强调的是性能,其执行数度比数据库innodb和myisam类型更快但是不提供事务支持,而数据库innodb和myisam提供事务支持以及外部键等高级数据库功能

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

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

  ◆3.对于AUTO_INCREMENT类型的字段,数据库innodb和myisam中必须包含只有该字段的索引但是在MyISAM表中,可以和其他字段一起建立联合索引

  ◆5.LOAD TABLE FROM MASTER操作对数据库innodb和myisam是不起作用的,解決方法是首先把数据库innodb和myisam表改成MyISAM表导入数据后再改成数据库innodb和myisam表,但是对于使用的额外的数据库innodb和myisam特性(例如外键)的表不适用

  两种類型最主要的差别就是数据库innodb和myisam 支持事务处理与外键和行级锁。而MyISAM不支持.所以MyISAM往往就容易被人认为只适合在小项目中使用

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

  1、平台上承载的大部分项目是读多写少的项目而MyISAM的读性能是比数据库innodb和myisam强不少的。

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

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

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

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

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

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

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

}

我要回帖

更多关于 数据库innodb和myisam 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信