概述

MyISAM存储引擎只支持表锁,mysql的表锁有两种模式:读锁和写锁。

他们的兼容关系是(对myisam的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写操作*)和(对myisam的写操作,则会阻塞其他用户对同一表的读和写操作),读写操作是串行的。

如何加表锁

MyISAM在执行查询语句(select)前,会自动给涉及的所有表加上读锁。

在执行更新操作(update,delete,insert等)前,会自动给涉及的表加上写锁,这个过程不需要用户干预。

说明:

lock tables 加上‘local’选项,其作用就是在满足MyISAM表并发插入条件下,允许其他用户在表尾并发的插入记录。

在lock tables 给表显式加表锁时候,必须同时取得所有涉及表的锁,并且MySQL不支持锁升级。

即在执行lock tables后,只能访问显式加锁的这些表,不能访问未加锁的表。 MyISAM总是一次获取sql语句所需要的全部锁。这就是MyISAM表不会出现死锁的原因。

当使用lock tables时,不仅需要一次锁定用到的表,而且,同一个表在sql语句中出现多少次,就要在相同的别名中锁定多少次。

并发插入

在一定的条件下,MyISAM表支持查询和插入并发执行。

MyISAm有一个系统变量concurrent_insert,用来专门控制其并发行为的。0-不允许插入;1-如果表没有空洞,允许在表尾插入记录,这是mysql默认设置;2-无论是否有空洞,都允许在表尾插入记录。

锁调度

myISAM的读锁和写锁是互斥的,读写串行的。那么,在一个进程请求某个MyISAM表的锁的时候,同时另一个进程也请求同一表的写锁。

MySQL如何处理?结果是先写进程后读进程。这是应为mysql认为写请求一般比读请求重要。我们可以通过一些设置来改变锁处理先后顺序:

通过启动参数low-priority-updates,使MyISAM引擎默认给予读侵权以优先权利。 通过set low_priority_updates=1,使该连接发出的更新请求优先级降低。 通过指定insert,update,delete语句的low_priority属性,降低该语句的优先级。

还可以设置max_write_lock_count。当表的读锁到这个值的时候,mysql就暂时将写请求的优先级降低,给读进程一个获得锁的机会。

原文:http://www.2cto.com/database/201506/404702.html

mysql myisam表_mysql优化之MyISAM表锁相关推荐

  1. 物理机存放mysql实例原则_MySQL优化笔记(四)--表的设计与优化(单表、多表)...

    前面讲了SQL优化以及索引的使用.设计优化了,那么接下来就到表的设计与优化啦!!!真实地去设计优化单表结构以及讲述多表设计基本原则(结合真实的生产环境的取舍来讲述). 文章结构:(1)单表设计与优化: ...

  2. mysql optimize原理_MySQL数据库入门:表的Optimize 优化

    一.optimize优化原理 对mysql进行大量增删改操作,磁盘上的空间没有被立即收回(数据空间.索引位),而是等待新的数据来填充空缺 -- 这些空间可以被后续的insert操作利用,但如果记录是变 ...

  3. mysql 分表后排序_MySQL优化分库分表,为什么要分表,分表以后如何进行排序查询,业务如何设计?...

    昨天面试新人的时候,遇到了这么一个问题,按照自己的想法大体聊了一些,但大多是感性的,并没有完整的了解why and how. 今天查了一些相关的资料,包括<MySQL性能调优与架构设计>. ...

  4. mysql 分区合并_mysql中的合并表和分区表详解(经常使用的概念)

    分区表是mysql5.1之后的新特性,合并表已经存在很长时间了.这篇文章主要介绍这两个概念以及他们基本的操作. 一.合并表 合并表说实话是一种将要被淘汰的技术,但是掌握了合并表的概念再去看分区表就比较 ...

  5. mysql 分表_MySQL如何分库分表

    数据库分库分表估计很多伙伴都没有实践过,就是因为自己公司的业务不是很多,没有那么多数据.假如有一天项目的人数上来了,你写的系统支撑不住了,希望这篇文章带给你一丝丝的思路." 前言 在面试过程 ...

  6. mysql 表字段信息从一张表迁移到另一张表_Mysql之分库分表

    互联网系统需要处理大量用户的请求.比如微信日活用户破10亿,海量的用户每天产生海量的数量:美团外卖,每天都是几千万的订单,那这些系统的用户表.订单表.交易流水表等是如何处理呢? 数据量只增不减,历史数 ...

  7. mysql多张表join_SQL优化之多表join

    关于Join 如上图所示,left join和inner join的取值范围还是有很明显的不同的,看网上不少文章优化left join也不交代上下文环境,直接就是教唆把left join换成inner ...

  8. mysql查看比较大的数据表_mysql 如何查看哪些表数据量比较大

    数据库中有几十上百张表,那么哪些表的数据量比较大呢,总不能一个表一个表的去查询吧,在mysql中也有类似于oracle的数据字典表,只不过mysql没有oracle记录的那么多和详细,但也足够我们查询 ...

  9. mysql数据库检表_MYSQL数据库检查数据表和修复数据表

    数据库在运行中,会因为人为因素或一些不可抗力因素造成数据损坏.所以为了保护数据的安全和最小停机时间,我们需制定详细的备份/恢复计划,并定期对计划的有效性进行测试. 结合MySQL服务器的运行机制和所提 ...

最新文章

  1. 踩坑了,JDK8中HashMap依然会产生死循环问题!
  2. Spring学习手册番外:context:annotation-config/ 和 mvc:annotation-driven / 的区别
  3. 从源码看runLoop
  4. springboot配置html资源路径,SpringBoot普通.html文件视图配置
  5. springboot接收文件上传_SpringBoot第十七篇:上传文件
  6. webservice 缓存机制
  7. python3 ftp启动_python3利用pyftpdlib模块启动ftp服务
  8. KVM Disk Cache简析
  9. 龙腾世纪:起源(推荐一个可以用来英语学习的RPG游戏)
  10. aspen plus大小_[软件]Aspen Plus 这些常识,你都懂了吗?
  11. 如何看待B站疑似源码泄漏的问题?
  12. java pdf 文字_Java如何使用Java向PDF页面中添加文本
  13. Matlab之isprime与find函数
  14. 灯管实验的em算法_【大学物理实验】日光灯电路的组装及参数测量.ppt
  15. 【测试记录】基于pdf论文提取论文doi—pdf2doi包的安装与使用
  16. 解决VS Code 运行 “conda : The term ‘conda‘ is not recognized as the name of a cmdlet, function, script “
  17. “博客之星”年度评选
  18. 适合小学生python的书_小学生开始学Python,最接近AI的编程语言:安利一波Python书单...
  19. FRAM芯片扩展在低功率应用中的耐力
  20. ubuntu VCS+verdi安装教程

热门文章

  1. Qt Line Text Plaintext EDIT区别
  2. react iframe 使用contentWindow.postMessage 传递参数
  3. 数学真题 2014-2015
  4. Bootstrap使用bootstrap-select的坑[记录]
  5. 使用Docker创建镜像的三种方法
  6. java jta_JAVA事务系列三:JTA事务
  7. C#:实现DFA算法(附完整源码)
  8. Deformity ASP/ASPX Webshell、Webshell Hidden Learning
  9. java实现空心验证码_Java实现验证码
  10. js 四舍五入函数 toFixed()