转载:https://www.cnblogs.com/xc-chejj/p/11245034.html

MyISAM是默认表类型,基于ISAM(Indexed Sequential Access Method索引顺序访问方法),它是存储记录和文件的标准方法,不是事务安全的,不支持外键,如果有大量的select,MyISAM比较合适。MyISAM表示独立于操作系统之外的,通俗点说就是你可以很轻松的将MyISAM表从windows移植到linux或者从linux移植到windows。

InnoDB支持事务安全,支持外键、行锁,事务是它的最大优点,如果有大量的insert和update,建议用InnoDB,特使是针对高并发和QPS(query per second)较高的情况。

1.  表锁差异

MyISAM

  MyISAM只支持表锁,在select、insert、update、delete都会锁表,开销小,加锁快,不会出现死锁。锁定粒度大,发生锁冲突的概率最高,并发量最低。

InnoDB

  InnoDB支持事务和行锁,开销大,加锁慢,会出现死锁。锁力度小,发生锁冲突的概率小,并发度最高。

  1>     事务的ACID属性

    a)         原子性(Atomicity):原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

    b)         一致性(Consistency):事务前后数据的完整性必须保持一致。

    c)         隔离性(Isolation):事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

    d)         持久性(Durability):持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

  2>     并发事务带来的问题

    a)         脏读:一个事务修改了还没提交,另一个事务就读了。

    b)         不可重复读:一个事务两次读取数据之间,另一个事务修改了数据。

    c)         幻读:一个事务两次读取数据之间,另一个事务新增了数据。

    d)         丢失修改(更新丢失):两个事务同时修改每个数据,一个事务的提交破坏了另一个事务的修改。例如,T1读A修改为A-1,T2也读A修改为A-1(实际上T2读A-1修改为A-2)。

  3>     事务隔离级别

隔离级别

读数据一致性

并发副作用

脏读

不可重复读

幻读

未提交读

(Read uncommitted)

最低级别,不读物理上损坏的数据

已提交读

(Read committed)

语句级

可重复读

(Repeatable read)

事务级

可序列化

(Serializable)

最高级别,

事务级

    查看mysql的默认事务隔离级别“show global variables like ‘tx_isolation’;”

  4>     InnoDB的行锁模式有以下几种:共享锁,排他锁,意向共享锁(表锁),意向排他锁(表锁),间隙锁。

    注意:当语句没有使用索引,InnoDB不能确定操作的行,这个时候就使用的意向锁,也就是表锁。

  5>     关于死锁

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

    b)         解决死锁的方法:

      1、数据库参数;

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

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

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

2.  数据库文件差异

MyISAM

  MyISAM属于堆表。

  1>     在磁盘上存储有3个文件,每个文件以表名为开头。

    .frm用于存储表的定义

    .MYD用于存放表的数据

    .MYI用于存放表的索引

  2>     在mysql中可以创建3种MyISAM格式的表——静态、动态和压缩。格式不需要单独指定,mysql会根据表结构自动选择最合适的格式。

    a)         MyISAM静态:如果表的每个字段的数据类型的定义都是使用静态的(如char),mysql就会自动使用静态MyISAM格式,这种类型格式的表的性能是很高的,也就是查询更新用的时间很少,但要知道这是在牺牲空间为代价。因为每一列都要分配最大的空间,即使有部分空间没有用到,这就使得静态的表所占的空间会比较大。

    b)         MyISAM动态:如果表的每个字段的数据类型的定义都是使用动态的(如varchar),mysql就会自动使用动态MyISAM格式,这种类型格式的表的性能会有所下降,但是它的空间占有要比静态的少很多。

    c)          MyISAM压缩:如果有一张表在设计之初只赋予了它读的使命,就可以用MyISAM压缩表,在相同的配置下,它的性能是最快的。

InnoDB

  InnoDB属于索引组织表。

  InnoDB有两种存储方式,共享表空间存储和多表空间存储,两种存储方式的表结构和MyISAM一样,以表名开头,扩展名是.frm。

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

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

3.  索引差异

关于自动增长

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

InnoDB引擎的自动增长列必须是索引,如果是组合索引也必须是组合索引的第一列。

关于主键

MyISAM允许没有任何索引和主键的表存在,MyISAM的索引都是保存行的地址。

InnoDB引擎如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),InnoDB的数据是主索引的一部分,附加索引保存的是主索引的值。

关于count()函数

MyISAM保存有表的总行数,如果select count(*) from table;会直接取出出该值。

InnoDB没有保存表的总行数,如果使用select count(*) from table;就会遍历整个表,消耗相当大,但是在加了wehre 条件后,MyISAM和InnoDB处理的方式都一样。

全文索引

MyISAM支持 FULLTEXT类型的全文索引。

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

delete from table

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

索引保存位置

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

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

4.  几点注意事项

  1. 可以用 show create table tablename 命令看表的引擎类型。

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

  3. 可以执行以下命令来切换非事务表到事务(数据不会丢失),InnoDB表比MyISAM表更安全:alter table tablename type=innodb;或者使用 alter table tablename engine = innodb;

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

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

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

    3>       尽量避免死锁。

    4>       sql语句如果有where子句一定要使用索引,尽量避免获取意向排他锁。

    5>       针对开发,一般日志表之类的都是不修改的,可以用MyISAM,而其他表要用到事务,要频繁修改的可以用InnoDB。

MyISAM和InnoDB的差异的更多相关文章

  1. 1分钟了解MyISAM与InnoDB的索引差异

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/z50L2O08e2u4afToR9A/article/details/82111747 <数据 ...

  2. MyISAM与InnoDB的索引差异

    数据库的索引分为主键索引(Primary Index)与普通索引(Secondary Index).InnoDB和MyISAM是怎么利用B+树来实现这两类索引的,又有什么差异呢?一.MyISAM的索引 ...

  3. 了解MyISAM与InnoDB的索引差异(转)

    出处原文: 1分钟了解MyISAM与InnoDB的索引差异 数据库的索引分为主键索引(Primary Inkex)与普通索引(Secondary Index).InnoDB和MyISAM是怎么利用B+ ...

  4. MySQL存储引擎中的MyISAM和InnoDB区别详解

    在使用MySQL的过程中对MyISAM和InnoDB这两个概念存在了些疑问,到底两者引擎有何分别一直是存在我心中的疑问.为了解开这个谜题,搜寻了网络,找到了如下信息: MyISAM是MySQL的默认数 ...

  5. MyIsam与InnoDB主要区别

    MyIsam与InnoDB主要有以下4点大的区别,缓存机制,事物支持,锁定实现,数据物理存储方式(包括索引和数据). 1.缓存机制 myisam 仅仅缓存索引,不会缓存实际数据信息,他会将这一工作交给 ...

  6. MySQL存储引擎中的MyISAM和InnoDB区别

    MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良.虽然性能极佳,但却有一个缺点 ...

  7. MyIsam与InnoDB存储引擎主要区别

    MyIsam与InnoDB主要有以下4点大的区别,缓存机制,事务支持,锁定实现,数据物理存储方式(包括索引和数据). 1.缓存机制 myisam 仅仅缓存索引,不会缓存实际数据信息,他会将这一工作交给 ...

  8. MyISAM与InnoDB的区别是什么?

    1. 存储结构 MyISAM:每个MyISAM在磁盘上存储成三个文件.第一个文件的名字以表的名字开始,扩展名指出文件类型..frm文件存储表定义.数据文件的扩展名为.MYD (MYData).索引文件 ...

  9. MyISAM和Innodb区别,为什么?

    事务支持 MyISAM不支持事务,而InnoDB支持. InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事务,自动提交,这样会影响速度, 所以最好是把多条SQL语句显 ...

随机推荐

  1. Poj2965 冰箱的开关

    #include<iostream> using namespace std; int flag; int step; ][]; ] = { }; ] = { }; void turn(i ...

  2. 使用vue2.0创建的项目的步骤

    1.由于vue项目依赖 node.js npm 需要先安装.   若没有请先安装,请百度 //检查是否有node.js  npm vue win+r   输入cmd  输入node -v  回车 会出 ...

  3. Android数据传递

    直接用一个例子说明,简单粗暴: 数据传递会用到此界面标注id值的三个控件 Activity_zc.xm l 当点击“注册”按钮,会显示注册信息 Activity._show.xml 下面展示zcAct ...

  4. OpenStack知识点详解

    一:云计算     一.起源 1. 云计算这个概念首次在2006年8月的搜索引擎会议上提出,成为了继互联网.计算机后信息时代的又一种革新(互联网第三次革命). 2. 云计算的核心是将资源协调在一起,使 ...

  5. PIC单片机的i2c的程序

    #include<pic.h>#define uchar unsigned char#define uint unsigned int#define add 0xaa__CONFIG(0x ...

  6. Nexus Repository Manager 3(CVE-2019-7238) 远程代码执行漏洞复现

    0x00 漏洞背景 Nexus Repository Manager 3是一款软件仓库,可以用来存储和分发Maven,NuGET等软件源仓库.其3.14.0及之前版本中,存在一处基于OrientDB自 ...

  7. Rocket - diplomacy - LazyModule的实例化

    https://mp.weixin.qq.com/s/9PsBt4_4qHx4i6C5XtuiUw   介绍LazyModule和Node构造方法的执行过程,即实例化过程.     1. NullIn ...

  8. Java实现 LeetCode 744 寻找比目标字母大的最小字母(二分法)

    744. 寻找比目标字母大的最小字母 给定一个只包含小写字母的有序数组letters 和一个目标字母 target,寻找有序数组里面比目标字母大的最小字母. 在比较时,数组里字母的是循环有序的.举个例 ...

  9. Java实现 蓝桥杯VIP 算法训练 一元三次方程

    问题描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差 ...

  10. Spring IOC 概念及作用

    一:程序之间的耦合及解决 耦合性(Coupling):也叫耦合度,是对模块间关联程度的度量.耦合的强弱取决于模块间接口的复杂性.调用模块的方式以及通过界面传送数据的多少.模块间的耦合度是指模块之间的依 ...