(5)mysql优化之MyISAM表锁

概述

??MyISAM存储引擎只支持表锁,mysql的表锁有两种模式:读锁和写锁。他们的兼容关系是(对myisam的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写操作*)和(对myisam的写操作,则会阻塞其他用户对同一表的读和写操作),读写操作是串行的。

如何加表锁

??MyISAM在执行查询语句(select)前,会自动给涉及的所有表加上读锁。在执行更新操作(update,delete,insert等)前,会自动给涉及的表加上写锁,这个过程不需要用户干预。如果要显示加锁,参见链接:

http://blog.csdn.net/pursuing0my0dream/article/details/45166975

说明:

  • 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就暂时将写请求的优先级降低,给读进程一个获得锁的机会。
时间: 2024-08-24 19:23:15

(5)mysql优化之MyISAM表锁的相关文章

锁(MySQL篇)—之MyISAM表锁

前言 锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有数据库必须解决的一个问题,所冲突也是影响数据库并发访问的一个重要因素. MySQL表概述 相比其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking):BDB存储引

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

MySQL优化分库分表,为什么要分表,分表以后如何进行排序查询,业务如何设计? 昨天面试新人的时候,遇到了这么一个问题,按照自己的想法大体聊了一些,但大多是感性的,并没有完整的了解why and how. 今天查了一些相关的资料,包括<MySQL性能调优与架构设计>.<高性能Mysql>,慢慢的整体理解,请大家指正. 之一,为什么要分表? 分表,按形式,有水平分表和主附分表.水平分表常见于按ID取模或者按日期将相同表结构的内容散列到不同的表上,主附分表常见于有对应关系的多张表,通过

MyISAM表锁

MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制. MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking). BDB 存储引擎采用的是页面锁(page-level locking),但也支持表级锁. InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁. 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低. 行级锁:开销大,加锁慢;会出现死锁;锁

MySQL存储引擎 -- MyISAM(表锁定) 与 InnoDB(行锁定) 锁定机制

前言 为了保证数据的一致完整性,任何一个数据库都存在锁定机制.锁定机制的优劣直接应想到一个数据库系统的并发处理能力和性能,所以锁定机制的实现也就成为了各种数据库的核心技术之一.本章将对MySQL中两种使用最为频繁的存储引擎MyISAM(表锁定)和Innodb(行锁定)各自的锁定机制进行较为详细的分析. MySQL锁定机制简介 数据库锁定机制简单来说就是数据库为了保证数据的一致性而使各种共享资源在被并发访问访问变得有序所设计的一种规则.对于任何一种数据库来说都需要有相应的锁定机制,所以MySQL自

(4)mysql优化之数据库表设计优化

概述 在数据库设计过程中,用户可能会经常遇到这样的问题:1.表里面的字段到底该设置多长合适?2.是否应该把所有表都按照第三范式来设计? 优化表的数据类型 1.语法 表的数据类型参见链接: http://blog.csdn.net/pursuing0my0dream/article/details/44729707 在mysql中,我们可以使用函数 procedure analyse()对数据库中的表进行分析,该函数可以对数据表中的列的数据类型提出优化建议. #语法 select * from t

Mysql 优化之库表设计

定长与变长分离 常用与不常用列分离 例如: 这张表不够好,可以优化 分析:这张表除了username/intro列之外,每一列都是定长的. 我们不妨让其所有列,都定长,可以极大提高查询速度. Username char(10) 是会造成空间的浪费,但是提高的速度,值. Intro char(1500) 却浪费的太多了,另一方面,人的简介,一旦注册完,改的频率也并不高. 我们可以把 intro列单独拿出来,另放一张表里.

mysql查询更新时的锁表机制分析(只介绍了MYISAM)

为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制. 一.概述 MySQL有三种锁的级别:页级.表级.行级.MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking):BDB存储引擎采用的是页面锁(page-level locking),但也支持表级锁:InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁. MySQL这3种锁的特性可大致归纳如下: 表级锁:开销小,加

MySQL中的锁(表锁、行锁,共享锁,排它锁,间隙锁)

本文参考: http://mysqlpub.com/thread-5383-1-1.html http://blog.csdn.net/c466254931/article/details/53463596 有很多是转载合并过来. 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的 计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有数据库必须解决的一 个问题,锁冲突也是影响数据库并发访问性能的一个重

MySQL学习之——锁(行锁、表锁、页锁、乐观锁、悲观锁等)

锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具.在计算机中,是协调多个进程或县城并发访问某一资源的一种机制.在数据库当中,除了传统的计算资源(CPU.RAM.I/O等等)的争用之外,数据也是一种供许多用户共享访问的资源.如何保证数据并发访问的一致性.有效性,是所有数据库必须解决的一个问题,锁的冲突也是影响数据库并发访问性能的一个重要因素.从这一角度来说,锁对于数据库而言就显得尤为重要. MySQL锁 相对于其他的数据库而言,MySQL的锁机制比较简单,最显著的特点就是不同的存储引擎支持不