Mysql优化(出自官方文档) - 第十二篇(优化锁操作篇)

1 Internal Locking Methods

这里介绍Mysql的几种锁,该锁由Mysql自行进行管理,用户不需要处理该锁。

  • Row-Level Locking

    对于InnoDB,行锁可以通过SELECT ... FOR UPDATE语句进行获取,如果行锁中出现了死锁,Mysql会自行检测死锁,并对相关的事务进行一定的回滚,这会极大的影响性能。行锁的优点如下:

    • 当不同session访问不同的行时,可以产生更少的冲突。
    • 当出现rollback的时候,需要rollback的内容也更少。
    • 可以长时间的锁定某一行。
  • Table-Level Locking

    对于MyISAM, MEMORY或者MERGE表,使用的是表锁,这种类型的表使用场景多为read-only, read-mostly或者single-user应用中。在获取表锁的时候,如果多个请求需要获取同一张表的锁,那么通常就需要进行排序,当前请求必须等到前一个请求处理完成后才能获取到表锁进行后续的处理。

    表锁的优点为:

    • 更少的锁内存占用(行锁往往需要较多的内存)
    • 当需要处理一个表中大部分行的时候速度很快,因为只需要处理一个锁就可以了。
    • 进行GROUP BY的时候,效率更高,因为这种操作需要扫描整张表。
  • Choosing the Type of Locking

    通常来讲,对于下面的场景,表锁优于行锁:

    • 大多数都是读的场景

    • 混合读写,但是写只包含更新和删除(没有插入),且都是更新和删除具体的一行(即通过unique_key获取的行),比如下面的语句:

      UPDATE tbl_name SET column=value WHERE unique_key_col=key_value;
      DELETE FROM tbl_name WHERE unique_key_col=key_value;
    • 带有多个并发INSERTSELECT语句,也可以有极少数的UPDATEDELETE语句

    • 多个scan或者GROUP BY操作,但是需要保证没有写入语句。

    通过使用更高级的锁,你可以更加轻松的调试并加快应用程序的效率,这些高级别的锁开销要比行级锁小很多,这些锁包括:

    • 版本控制(Versioning)可以允许同时存在多个写和读,这意味这数据库或者表对于不同的请求支持多个不同的views,实现这种功能的手段经常有:"time travel", "copy on write", "copy on demand"等。
    • Copy on demand在大多数情况下是比行锁要好的,但是在极端情况下,要比普通的锁占用更多的内存。
    • 也可以使用应用级别的锁,使用 GET_LOCK() and RELEASE_LOCK()

2 Metadata Locking

Mysql使用metadata Locking来管理对数据库对象的并发访问和保证数据的一致性,该锁不仅适用于表,也适用于schemas,stored programs(包括存储过程,函数,触发器,scheduled events), tablespaces, 使用主动使用GET_LOCK()获取到的锁。可以通过 metadata_locks 表查看当前metadata Locking的详情。

  • Metadata Lock Acquisition

    对于DML来讲,锁的获取按照statement里面涉及到的顺序进行;对于DDL,为了减小可能存在的死锁问题,锁的获取按照表名顺序进行,当然,也有特例,对于那些带有外键的表,其子表的锁也同时会被隐性的获取。

  • Metadata Lock Release

    • Mysql在事务开始,会获取metadata locking,在事务结束,会自动释放lock,如果当前事务对某表进行操作,其他事务尝试对该表进行DDL操作,那么其他事务会阻塞。

    • 除了DDL语句,LOCK TABLES ... READ语句也会有获取metadata Locking的效果。

    • 如果一个事务中,某条语句获取了metadata Locking,但是后续语句执行失败了,对于该事务,Mysql不会提前释放metadata Locking,因为这些失败的语句会写入到binlog中,锁可以保证log的一致性

    • autocommit模式下,每一条语句都是一个完整的事务,所以metadata locking的获取和释放只发生在语句的开始和结束。

    • 对于prepare语句,锁的获取开始于prepare语句,结束于prepare语句完成后。

    • 对于Mysql8.0.13,一个处于PREPARED状态的XA事务,即使客户端失去了链接或者服务器重启了,metadata lock也会一直被保存着(持久化),除非XA COMMIT or XA ROLLBACK被执行。

3 External Locking

外部锁通常指多个Mysql进程共享一个数据文件夹,导致该文件夹被其他进程锁住的时候,当前进程就不能继续进行操作了,一般不要这么做。同时,对于MyISAM,myisamchk命令也可能会导致这种情况,需要特别注意下。

Mysql优化(出自官方文档) - 第十二篇(优化锁操作篇)的更多相关文章

  1. 【cocos2d-js官方文档】十二、对象缓冲池

    cc.pool的使用场景 经常创建和销毁的元素,例如打飞机游戏里面的子弹等. 不适用的场景:不是很经常创建的物体,比如背景,建筑等. 如何使用cc.pool 让你的类支持cc.pool 首先,你需在需 ...

  2. Mysql优化(出自官方文档) - 第十篇(优化InnoDB表篇)

    Mysql优化(出自官方文档) - 第十篇(优化InnoDB表篇) 目录 Mysql优化(出自官方文档) - 第十篇(优化InnoDB表篇) 1 Optimizing Storage Layout f ...

  3. Mysql优化(出自官方文档) - 第三篇

    目录 Mysql优化(出自官方文档) - 第三篇 1 Multi-Range Read Optimization(MRR) 2 Block Nested-Loop(BNL) and Batched K ...

  4. Mysql优化(出自官方文档) - 第五篇

    目录 Mysql优化(出自官方文档) - 第五篇 1 GROUP BY Optimization 2 DISTINCT Optimization 3 LIMIT Query Optimization ...

  5. Mysql优化(出自官方文档) - 第八篇(索引优化系列)

    目录 Mysql优化(出自官方文档) - 第八篇(索引优化系列) Optimization and Indexes 1 Foreign Key Optimization 2 Column Indexe ...

  6. Mysql优化(出自官方文档) - 第九篇(优化数据库结构篇)

    目录 Mysql优化(出自官方文档) - 第九篇(优化数据库结构篇) 1 Optimizing Data Size 2 Optimizing MySQL Data Types 3 Optimizing ...

  7. Mysql优化(出自官方文档) - 第七篇

    Mysql优化(出自官方文档) - 第七篇 目录 Mysql优化(出自官方文档) - 第七篇 Optimizing Data Change Statements 1 Optimizing INSERT ...

  8. Mysql优化(出自官方文档) - 第六篇

    Mysql优化(出自官方文档) - 第六篇 目录 Mysql优化(出自官方文档) - 第六篇 Optimizing Subqueries, Derived Tables, View Reference ...

  9. Mysql优化(出自官方文档) - 第四篇

    Mysql优化(出自官方文档) - 第四篇 目录 Mysql优化(出自官方文档) - 第四篇 1 Condition Filtering 2 Constant-Folding Optimization ...

随机推荐

  1. 【Linux】 Linux网络编程

    作者:李春港 出处:https://www.cnblogs.com/lcgbk/p/14779410.html 目录 前言 (一). 回顾系统编程进程的通信方式 (二). 网络编程大纲 (三). 网络 ...

  2. Java线程池的工作流程

    线程池刚被创建的时候,只是向系统里申请一个用于执行流程队列和管理线程池的线程资源.在调用execute()添加一个任务时,线程池会按照以下流程执行: 1.如果正在运行的线程数少于corePoolSiz ...

  3. shell脚本常用语法详解

    逻辑控制 if 语法:注意空格 a=1b=2if [ $a == $b ]then    echo "a==b"elif [ $a -gt $b ]then    echo &qu ...

  4. Java集合详解(一):全面理解Java集合

    概述 Java所有集合类都在java.util包下,支持并发的集合在java.util.concurrent(juc)包下. 集合与数组区别: 数组大小是固定的,集合大小可以根据使用情况进行动态扩容. ...

  5. Mybatis-Plus的应用场景及注入SQL原理分析

    一.背景 1.1 传统Mybatis的弊端 1.1.1 场景描述 假设有两张表:一张商品表.一张订单表,具体表的字段如下: 现有如下需求: 分别根据id查询商品表和订单表所有信息 根据支付状态和通知状 ...

  6. 1Spring注入小结

    Spring注入小结 (在Application.xml中) Spring学习笔记 周芋杉2021/5/14 1.基本注入类型注入 注入前的准备 <bean id="#配置文件的唯一标 ...

  7. [刷题] 77 Combinations

    要求 给出两个整数n和k,在n个数字中选出k个数字的所有组合 示例 n=4 , k=2 [ [ 1, 2 ] , [ 1, 3 ] , [ 1, 4 ] , [ 2, 3 ] , [ 2, 4 ] , ...

  8. linux动态链接库和静态链接库

    Linux下静态链接库与动态链接库的区别 引言 通常情况下,对函数库的链接是放在编译时期(compile time)完成的.所有相关的对象文件 (object file)与牵涉到的函数库(librar ...

  9. STM8的AIR与STM32的Keil的指定地址存数据

    [经验分享]KE02在IAR和KEIL中以常量形式初始化EEPROM值一, 经验分享描述        写这篇经验分享的原因是,之前有一个客户,他希望在KE02的芯片中,不要出现使用EEPROM操作命 ...

  10. nignx反向代理web服务器的配置与使用

    一.为什么要用nignx反向代理 1.负载均衡 当一台服务器的单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃.为了避免服务器崩溃,让用户有更好的体验,我们通过负载均 ...