zoukankan      html  css  js  c++  java
  • MyISAM和Innodb的区别

    MyISAM和Innodb是mysql数据库前后的两种默认数据存储引擎,那么两者究竟有什么区别呢?

    一,首先是在锁的方面

    MyISAM之可以使用表级锁,不支持使用行级锁。这是什么意思呢?

    在MyISAM数据库执行读请求期间,会默认对该请求加上共享锁(读锁),在这一个锁级别下,用户可以进行读共享不可以进行写请求。当然我们也可以使用Local tables <tableName> read|write来将表的锁住,阻塞其他的读或者写请求解锁是<unlock tables>。

    同样如果MyISAM还自带排他锁,也就是写锁。意思就是当数据库在执行写请求时不允许用户其他请求的干扰。也就是上了共享锁之后可以继续上共享锁,但是上了写锁之后不能施加任何锁。

    Innodb默认使用行级锁,但是也支持表级锁。实际上这也是Innodb能够保证事务不出问题的真正原因。

    Innodb是支持事务的,所以我们可以通过session取锁暂时不自动提交的方式模拟并发访问的过程。

    Innodb加锁默认的是加二级锁,我们可以在使用set autocommi=0关闭当前事务的自动提交,这样就需要在执行事务之前加锁(lock in share mode为手动加共享锁,for update 为手动加排他锁,commit之后进行统一解锁。)比如  我们可以select * from <tableName> where id =3 lock in share mode。只要不执行commit,这行就会永远的锁下去,同理,我们也可以使用for update为他手动添加排他锁。commit时,锁才会被释放。

    二,count运算上的区别:

    因为MyISAM有meta-data,所以全量查询很快,但是INNODB没有
    三,事务与安全:

    MyISAM性能会更快,但是不支持事务,INNODB支持事务,所以也支持事务相关的,隔离,回滚,等等的ACID操作
    四,MyISAM不支持外键,INNODB支持

    五,在索引方面。

    说到这一点就不得不说一样密集索引和稀疏索引的区别,密集索引是指每一个搜索码的值都对应一个索引值。

    稀疏索引文件只为索引码的某些值建立索引项。

    在MyISAM中,

    不管是主键索引,唯一键索引还是普通索引,其索引都属于稀疏索引。

    在InnoDB中,

    若一个主键被定义,则主键则作为密集索引。
    若没有主键被定义,该表的第一个唯一非空索引则作为密集索引。
    若不满足以上条件,INNODB内部会生成一个隐藏主键(密集索引)。
    非主键索引存储相关键位和其对应的主键值,包含两次查找。

  • 相关阅读:
    在java中有关于反射的皮毛----自己的简略认知
    在java中异常中的题目---重要的一点
    在一个陌生的环境里学习新的-----单例
    在java开发环境中,快捷键的使用及用法
    指针(一)
    #ifdef、#ifndef、#else、#endif执行条件编译
    oc中的数组
    控制循环结构
    oc中的枚举
    oc中类的实例化及方法调用
  • 原文地址:https://www.cnblogs.com/ffdsj/p/12386051.html
Copyright © 2011-2022 走看看