`

MySQL MyISAM与表锁

阅读更多

MySQL MyISAM与表锁

 

在数据库中,除了CPU、内存、IO等的争用外,数据也是一种供许多用户共享的资源,如何保证数据并发的一致性、有效性是所有数据库必须解决的问题,锁冲突也是影响数据库并发性能的一个重要因素。MySQL中不同的存储引擎之间的锁机制不一定相同,例如MyISAM和MEMORY采用的是表锁,BDB采用的是页面锁,但野支持表锁,InnoDB默认是行锁,但也支持表锁。

 

MySQL锁大体分三种:

  1. 表锁:开销小,加锁快;不会出现死锁;锁粒度大,发生锁冲突几率高,并发度最低
  2. 行锁:开销大,加锁慢;会出现死锁;锁粒度小,发生锁冲突几率小,并发度最高
  3. 页锁:开销和加锁时间介于表锁和行锁之间;会出现死锁,锁粒度介于表锁和行锁之间

 仅从锁的角度来讲,表锁使用于以查询为主,只有少量按索引条件更新数据的应用,如WEB应用;而行级锁更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理(OLTP)系统。

 

MyISAM表锁

MyISAM只支持表锁,这也是早期MySQL的唯一支持的锁。而随着应用对事务完整性和并发性要求的不断提高,MySQL才开始开发基于事务的存储引擎,后来慢慢出现了支持页锁和BDB和支持行锁的InnoDB。

 

表锁有共享读锁和独占写锁两种模式。读锁与读锁是兼容的,读锁与写锁是互斥的,写锁与写锁是互斥的。也就是说,MyISAM表的一个连接的读操作是不会阻塞其它连接的读操作的,但是会阻塞其它连接的写操作,而一个连接的写操作会阻塞其它连接的读操作和写操作。

 

MyISAM在执行查询(SELECT)时会自动给涉及到的表加上读锁,在执行更新(UPDATE、DELETE、INSERT)等,会自动给涉及到的表加上写锁。但是我们也可以显示加锁/解锁:

 

LOCK TABLES
    tbl_name [[AS] alias] lock_type
    [, tbl_name [[AS] alias] lock_type] ...

lock_type:
    READ [LOCAL]
  | [LOW_PRIORITY] WRITE

UNLOCK TABLES

 LOCAL关键字用于指示允许并发插入,后面会讲到

 

以下演示一些情况锁定情况:

 读阻塞写


 

以下黑背景色的会话A,灰背景色的为会话B

 

会话A给user加读锁,加锁后会话A可以查询,但不可以插入

会话B可以查询,但插入会阻塞:


 

会话A释放锁后,会话B才插入成功:



 

只能访问加锁的表

对表加锁后只能访问加了锁的表,不能访问没加锁的表:

 


 



 

凡是用到的别名都要加一次锁

 在使用别名时,必须对别名也加锁,而且即使是同一个表,如果别名不一样也需要另外加锁:



 

 

并发插入

MyISAM表的读和写是串行的,但在一定条件下,MyISAM表也支持查询和插入的并发执行,MyISAM引擎有一个concurrent_insert变量,专门用来控制其并发插入的行为,取值为0(或NEVER),1(或AUTO)和2(或ALWAYS),当concurrent_insert为0时,不允许并发插入,当concurrent_insert为1时如果表中没有空洞(即表的中间没有被删除的行),那么允许一个会话读表的同时,另一个表在表尾插入记录,这是默认值;当concurrent_insert为2时,允许在表尾并发插入记录。

 

接下来演示这三种模式的效果

 设置concurrent_insert为0:


 会话A给user表加锁(注意此处一定要加LOCAL关键字)

 可以看到,会话B插入会阻塞:

 

设置concurrent_insert为1,会话A给user加读锁,


 会话B依然可以插入,因为此时表没有空间碎片(可以用optimize table table_name整理碎片)

删除一些数据后(制造碎片)再上锁:

此时会话B再次试图插入数据,可以看到其会被阻塞:


 

设置concurrent_insert为2,会话A给user加读锁:


 会话B可以在插入数据:

 

如果你的应用中用了MyISAM的表,并且你想有一定的插入并发,那么就可以设置concurrent_insert为2,并且定期地在空闲时期执行OPTIMIZE TABLE来整理碎片。

 

另外值得注意的是,当一个会话A请求MyISAM表的读锁,另一个会话B也请求同一个表的写锁时,MySQL会让会话B获得写锁,甚至,假如锁等待队列中读请求先到,写请求后到,MySQL同样也会让写请求插入到读请求前面。这也是为什么MyISAM表不太适合于有大量更新操作和查询操作应用的原因,大量的更新操作会早场查询操作很难获得锁从而可能阻塞很长一段时间。对此,我们可以做一些设置来打破这个规则:

  1. 通过启动参数low-priority-updates,使MyISAM引擎默认给予读请求更高的优先级
  2. 通过set low-priority-updates = 1,使当前连接发出的所有更新请求的优先级降低
  3. INSERT、UPDATE、DELETE语句都有一个LOW_PRIORITY属性,通过该属性,降低该语句的优先级,例如insert low_priority into user values ...

 

 参考:http://dev.mysql.com/doc/refman/5.7/en/lock-tables.html

深入浅出MySQL

 

  • 大小: 4.6 KB
  • 大小: 1.3 KB
  • 大小: 3 KB
  • 大小: 4.6 KB
  • 大小: 1.9 KB
  • 大小: 1.2 KB
  • 大小: 1.8 KB
  • 大小: 5.7 KB
  • 大小: 7 KB
  • 大小: 3.9 KB
  • 大小: 4.2 KB
  • 大小: 3.5 KB
  • 大小: 1.1 KB
  • 大小: 1.3 KB
  • 大小: 2.6 KB
  • 大小: 1.3 KB
  • 大小: 2.5 KB
  • 大小: 1.3 KB
  • 大小: 4.3 KB
  • 大小: 1.1 KB
0
1
分享到:
评论

相关推荐

    mysql高级笔记,mysql索引、存储过程、查询缓存、并发参数调整、MyISAM表锁、系统性能优化

    本笔记将深入探讨MySQL的几个关键高级主题,包括索引、存储过程、查询缓存、并发参数调整、MyISAM表锁以及系统性能优化策略。 首先,我们来讨论**MySQL索引**。索引是提高查询速度的关键,它在数据库中的作用类似于...

    MySQL 行锁和表锁的含义及区别详解

    在MySQL中,不同的存储引擎支持不同的锁机制,其中InnoDB引擎是默认引擎,支持行锁和表锁,而MyISAM引擎只支持表锁。 1. **行锁(Row Locks)** 行锁是在数据行级别上施加的锁,提供了最高的并发性能。在InnoDB...

    2021年MySQL高级教程视频.rar

    17.MySQL高级锁MyISAM表锁查看锁争用情况.avi 18.MySQL高级锁InnoDB行锁介绍及背景知识.avi 18.MySQL高级锁InnoDB行锁类型.avi 19.MySQL高级锁InnoDB行锁基本演示.avi 20.MySQL高级锁InnoDB行锁行锁升级为表锁.avi ...

    8.MySQL存储引擎--MyISAM与InnoDB区别1

    MySQL存储引擎--MyISAM与InnoDB区别 MySQL是一种关系型数据库管理系统,它支持多种存储引擎,每种存储引擎都有其特点和优缺。MyISAM和InnoDB是MySQL中最常用的两种存储引擎,它们都有其优缺点,本文将对比MyISAM...

    MySQL存储引擎之争-InnoDB与MyISAM全面对决

    MyISAM的表锁会导致写查询阻塞;InnoDB的行锁通过FOR UPDATE关键字实现并发读写;MyISAM的压缩表创建通过ROW_FORMAT=COMPRESSED指定。 综合来看,尽管InnoDB在事务和并发控制方面表现更优,已成为MySQL的默认存储...

    mysql数据据存储引擎InnoDB和MyISAM的优势及区别分享.pdf

    3. 锁定机制:InnoDB 使用行锁(locking on row level),而 MyISAM 使用表锁(table lock)。 4. 性能:InnoDB 的性能比 MyISAM 高,特别是在高并发场景下。 5. 数据存储:InnoDB 将数据和索引存放在表空间里,可能...

    MyISAM引擎与InnoDB引擎性能的对比

    MySQL数据库系统提供了多种存储引擎,其中最常用的两种是MyISAM和InnoDB。它们各自具有独特的特性和适用场景,理解二者的性能差异对于优化数据库设计至关重要。 MyISAM引擎是MySQL早期的默认存储引擎,以其高速度和...

    MySQL锁(表锁,行锁,共享锁,排它锁,间隙锁)使用详解

    MyISAM表锁的锁争用情况可以通过`SHOW STATUS LIKE 'table%'`命令来查看,如果`Table_locks_waited`的值较高,表示存在严重的锁争用。 在实际应用中,为了优化并发性能,需要合理设计事务的粒度和选择合适的锁类型...

    MySQL存储引擎MyISAM与InnoDB区别总结整理

    2、MyISAM与InnoDB存储引擎的主要特点 MyISAM存储引擎的特点是:表级锁、不支持事务和全文索引,适合一些CMS内容管理系统作为后台数据库使用,但是使用大并发、重负荷生产系统上,表锁结构的特性就显得力不从心; ...

    mysql锁分析(csdn)————程序.pdf

    MySQL 锁机制是 MySQL 数据库中用于管理并发访问的机制, MySQL 锁机制主要有三种类型:表锁、行锁、页锁。每种锁机制都有其特点和应用场景。 表锁 表锁是 MySQL 中最基本的锁机制,表锁分为共享锁和排他锁。共享...

    Memcached、Redis、MySQL存储层面试问题

    MyISAM和InnoDB是MySQL中两种不同的存储引擎,MyISAM支持表锁,InnoDB支持行锁。 ... 本文总结了Memcached、Redis和MySQL存储层的面试问题,涵盖了缓存机制、内存管理、分布式集群、事务处理、锁机制、数据类型等...

    mysql存储引擎(csdn)————程序.pdf

    但对只读或几乎只读的数据库,MyISAM的表锁策略是有效的。 此外,MyISAM在内存管理和磁盘空间占用上相对于InnoDB来说更为简单,因此在某些场景下,如数据仓库或报告服务器,MyISAM可能是更好的选择。然而,没有事务...

    将MySQL从MyISAM转换成InnoDB错误和解决办法

    ### 将MySQL从MyISAM转换成InnoDB的错误与解决方法 #### 一、问题背景及概述 本文主要探讨了在将MySQL数据库从MyISAM引擎转换为InnoDB引擎时遇到的问题及其解决方法。作者最初使用的是一款仅支持MyISAM引擎的非...

    深入理解MySQL核心技术_MYSQL_

    5. **锁机制**:MySQL中的锁包括表锁、行锁、页锁等,不同存储引擎的锁机制有所不同。掌握锁的使用能避免死锁,保证数据安全。 6. **查询优化**:MySQL的查询优化器会选择最佳的执行计划。理解EXPLAIN命令,分析...

    MySQL+Redis数据库面试八股文

    innoDB 有行锁、表锁,Myisam 只有表锁。innoDB 是聚集索引,Myisam 是非聚集索引。二者存储文件不同,Myisam 有表定义、数据、表索引文件,innoDB 没有表索引文件。Myisam 自增 id 不会丢失,有记录总的来说 innoDB...

    MySQL数据库相关课件PPT

    MySQL支持多种存储引擎,例如InnoDB(支持事务处理、外键约束)、MyISAM(快速读取,不支持事务)、Memory(数据存储在内存中)等。选择合适的存储引擎对数据库性能有很大影响。 通过这些课件,学习者可以系统地...

    MySQL全局锁和表锁的深入理解

    MySQL中的锁定机制是数据库管理的重要组成部分,主要用于保证数据在并发环境下的安全性与一致性。全局锁和表锁是其中两种常见的锁定策略。 全局锁,顾名思义,是对整个数据库实例进行锁定,使得整个数据库在锁定...

    MySQL面试专题(带答案).pdf

    本篇文章对MySQL的面试相关知识点进行了总结和讲解,涵盖了数据库三范式、数据库优化经验、索引种类、MySQL基础操作命令、索引工作机制、MySQL复制原理、MySQL复制类型、MyISAM与InnoDB的区别等内容。

Global site tag (gtag.js) - Google Analytics