一.Mysql锁分类  

  1. 表级锁:开销小,加锁块;不会出现死锁,锁定粒度大,发生锁冲突的概率最高,并发度最低。
  2. 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发性也最高。
  3. 页面锁:开销和加锁界于表锁和行锁之间,会出现死锁;锁定粒度界与表锁和行锁之间,并发一般。

二.MyISAM

1.开门见山

  1. 1.MyISAM不支持事物;
  2. 2.MyISAM只支持表锁
  3. 不能在表损坏后恢复数据;

MyISAM表锁有两种模式:表共享读锁(table read lock)和表独占写锁(table write lock),锁的解释如下: 

  • myISAM表的读操作,不会阻塞其他用户对同一个表的读请求,但会阻塞对同一个表的写请求。
  • myISAM表的写操作,会阻塞其他用户对同一个表的读和写操作。
  • myISAM表的读、写操作之间、以及写操作之间是串行的。

适合在以下几种情况下使用:

  • 做很多count的计算
  • 查询非常频繁

MyISAM在执行查询前,会自动执行表的加锁、解锁操作,一般情况下不需要用户手动加、解锁,但是有的时候也需要显示加锁。当然也可以用union做关联查询代替

 lock table t1 read, t2 read;
select count(t1.id) as 'total' from t1;
select count(t2.id) as 'total' from t2;
unlock tables;
注意事项
1.在锁定表时候,如果加上关键字local,满足myISAM表的并发插入问题 。eg: lock table t3 read local;
2.使用locak tables 给表加锁时候,必须同时给所有涉及到的表加锁,因为加锁之后,当前会话,就不能操作没有加锁的表。

2.并发插入问题

MyIAM表的读和写是串行的,但是这是就总体而言,在一定条件下MyISAM表也支持查询和插入操作的并发进行.

MyISAM存储引擎有一个系统变量concurrent_insert,专门用于充值其并发插入的行为,其值分别可以为0,1和2 

当concurrent_insert = 0 时,不允许并发插入

当concurrent_insert = 1时,如果myisam表中没有空洞(即表的中间没有被删除的行),myisam允许在一个进程读表的同时,另一个进程从表尾插入记录

当concurrent_insert = 2时,无论myisam表中有没有空洞,都允许在表尾并发插入记录

 3.MyISAM锁调度问题

  MyISAM存储引擎的读锁和写锁是互斥的,读写操作室串行的,那么如果读写两个进程同时请求同一张表,Mysql将会使写进程先获得锁。不仅仅如此,即使读请求先到达锁等待队列,写锁后到达,写锁也会先执行。因为mysql因为写请求比读请求更加重要。这也正是MyISAM不适合含有大量更新操作和查询操作应用的原因。
调节办法:
  1. 通过指定启动参数low-priority-updates,使MyISAM引擎默认给与读请求优先的权限
  2. 通过执行set low_PRIORITY_UPDATES=1,降低更新请求的优先级。
  3. 指定INSERT、UPDATE、DELETE语句的LOW_PRIORITY属性。

三.InnoDB存储引擎

1.开门见山

  具有提交、回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。

  1. 支持事物和外键
  2. 默认是行锁
  3. 支持数据恢复

  注意:行锁在某些情况下会变成表锁,比如SQL的更新(update)或者删除(delete)语句中未使用到索引,导致在InnoDB在对数据进行相应操作的时候必须把整个表锁起来进行检索(表锁)。而如果使用了索引的话,InnoDB只会通过索引条件检索数据,而只锁住索引对应的行(行锁)。

2.实例分析

  问题描述:

  1. 系统中有一个实时的定时任务,当有条件触发的时候,会更新对应的A表;
  2. 但是同时有另外一个对A表的写操作,因此当进行测试的时候,有时候会不固定的出“Lock wait timeout exceeded”的错误。

  当出现这个问题的时候,从很多的地方进行了分析,然后都无法得到正确的解决方案(因为描述1模块不是我写的,所以没有去查看更新表的代码操作)

  可能的原因:

       在描述1中定时任务更新表A的时候,更新条件中没有使用索引,导致当进行定时任务更新表的时候形成了表锁。然后因为表A数据量比较大,检索较慢,然后导致了描述2中对表A的写操作的等锁超时。

3.适用的场景

  1. 更新和查询都相当的频繁,多重并发
  2. 要求事务,或者可靠性要求比较高
  3. 外键约束,MySQL支持外键的存储引擎只有InnoDB

  一般来说,如果需要事务支持,并且有较高的并发读取频率,InnoDB是不错的选择。

  

mysql数据库引擎InnoDB和MyISAM的更多相关文章

  1. mysql数据库引擎InnoDB和MyISAM的区别

    InnoDB支持行级锁和表级锁(默认行级锁),支持事务,外部键等:大量的insert和update更快等.只有通过索引条件检索数据,InnoDB 才使用行级锁,否则,InnoDB 将使用表锁. MyI ...

  2. 常用Mysql存储引擎--InnoDB和MyISAM简单总结

    常用Mysql存储引擎--InnoDB和MyISAM简单总结 2013-04-19 10:21:52|  分类: CCST|举报|字号 订阅     MySQL服务器采用了模块化风格,各部分之间保持相 ...

  3. Mysql数据库中InnoDB和MyISAM的差别

    Mysql数据库中InnoDB和MyISAM的差别 InnoDB和MyISAM是在使用MySQL最常用的两个表类型,各有优缺点,视具体应用而定.基本的差别为:MyISAM类型不支持事务处理等高级处理, ...

  4. MySQL存储引擎InnoDB,MyISAM

    MySQL存储引擎InnoDB,MyISAM1.区别:(1)InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语 ...

  5. MySQL存储引擎——InnoDB和MyISAM的区别

    MySQL5.5后,默认存储引擎是InnoDB,5.5之前默认是MyISAM. InnoDB(事务性数据库引擎)和MyISAM的区别补充: InnoDB是聚集索引,数据结构是B+树,叶子节点存K-V, ...

  6. mysql 存储引擎 InnoDB 与 MyISAM 的区别和选择

    http://www.blogjava.net/jiangshachina/archive/2009/05/31/279288.html     酷壳 - MySQL: InnoDB 还是 MyISA ...

  7. Mysql 存储引擎 InnoDB与Myisam的主要区别

    MySQL默认采用的是MyISAM. 1,事务处理 innodb 支持事务功能,myisam 不支持. Myisam 的执行速度更快,性能更好. MyISAM不支持事务,而InnoDB支持.InnoD ...

  8. MySQL存储引擎Innodb和MyISAM对比总结

    Innodb引擎 InnoDB是一个事务型的存储引擎,设计目标是处理大数量数据时提供高性能的服务,它在运行时会在内存中建立缓冲池,用于缓冲数据和索引. Innodb引擎优点 1.支持事务处理.ACID ...

  9. MySQL数据引擎InnoDB和MyISAM互相转换

    MySQL(或者社区开源fork的MariaDB)5.5以上支持InnoDB引擎,并将其作为默认数据库引擎.InnoDB带来很多改进,但是对系统资源占用明显增加,对于还在128MB-512MB内存VP ...

随机推荐

  1. 大坑记录 - shell脚本删除操作

    背景 jenkins执行去执行shell命令,其中引用了一些jenkins的变量,如${WORKSPACE}这种,因为每次执行jenkins比较慢,于是想复制脚本出来想本地调试一下,直接复制了脚本过来 ...

  2. Eclipse中Tomcat Server启动后马上又自动停止报错Address已经使用8005端口 Can't assign requested address (Bind failed)

    Eclipse中Tomcat Server启动后马上又自动停止报错 Can't assign requested address (Bind failed) ,打开Tomcat Server的配置页面 ...

  3. python3环境的搭建

    Python3 下载 Python3 最新源码,二进制文档,新闻资讯等可以在 Python 的官网查看到: Python 官网:https://www.python.org/ 你可以在以下链接中下载 ...

  4. GO学习笔记 - 没有参数的 return 语句返回各个返回变量的当前值,这种用法被称作“裸”返回。

    Go 的返回值可以被命名,并且就像在函数体开头声明的变量那样使用. 返回值的名称应当具有一定的意义,可以作为文档使用. 没有参数的 return 语句返回各个返回变量的当前值.这种用法被称作“裸”返回 ...

  5. 【vim】插入模式与常用编辑操作

    vim不像很多编辑器那样一启动便可以直接编辑文本,需要在普通模式按下i, a等键才会进入插入模式进行文本编辑. 如何进入插入模式 以下的命令都会让vim从普通模式切换到插入模式,但命令执行后的字符插入 ...

  6. docker 实例设置自动重启

    yaml格式太严格了,每个冒号后面都必须带有空格在linux中./代表当前目录,属于相对路径../代表上一级目录,属于相对路径/代表根目录,/开头的文件都是绝对路径./configure的意思是执行当 ...

  7. XCode7无证书真机调试教程

    转载自http://altair21.com/156.html 前提条件: XCode版本>=7 1. 进入xcode,菜单栏选择xcode –> preferences (快捷键 com ...

  8. Objective-C 之category

    参考资料:iOS设计模式——Category Category Category模式用于向已经存在的类添加方法从而达到扩展已有类的目的. 相当于Swift中的功能扩展(extension). 新添加的 ...

  9. 使用sqlyog将sql server 迁移到mysql

    使用软件工具sqlyog(64位) sqlyog 迁移步骤 1.使用sqlyog连接目标数据库 连接目标数据库 2.选择目标数据库(需要先把表结构建好,从SQL Server同步表结构也可以使用工具, ...

  10. 关于npm run dev报错npm ERR! missing script: dev

    出现这个问题应当重新使用 vue init webpack 来初始化工程. 在执行 npm run dev 就可以执行了.