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. MySQL角色(role)功能介绍

    前言: 上篇文章,我们介绍了 MySQL 权限管理相关知识.当数据库实例中存在大量的库或用户时,权限管理将会变得越来越繁琐,可能要频繁进行权限变更.MySQL 8.0 新增了 role 功能,使得权限 ...

  2. 爬虫:HTTP请求与HTML解析(爬取某乎网站)

    1. 发送web请求 1.1  requests 用requests库的get()方法发送get请求,常常会添加请求头"user-agent",以及登录"cookie&q ...

  3. es6.4.0安装和配置IK+拼音插件 实现非全拼搜索

    安装IK分词器 一.进入到es的plugins文件夹创建文件夹analysis-ikmkdir analysis-ik二.下载ik压缩包文件wget https://github.com/medcl/ ...

  4. Java_常用类API之一

    Math类 Math类中包含一些对数据进行数学运算的方法,而该类中的方法全都是静态的.像这样的类称之为工具类. 1 public static int abs(int a) 2 对一个数据求绝对值 3 ...

  5. 【二】Kubernetes 集群部署-kubeadm方式(亲测)

    一.概述 本次部署 Kubernetes 集群是通过 kubeadm 工具来进行部署, kubeadm 是 Kubernetes 官⽅提供的⽤于快速部署 Kubernetes 集群的⼯具,利⽤其来部署 ...

  6. Flutter 2.2 更新详解

    Flutter 2.2 版已正式发布!要获取新版本,您只需切换到 stable 渠道并更新目前安装的 Flutter,或前往 flutter.cn/docs/get-started 从头开始安装. 虽 ...

  7. golang:net/http理解总结

    Go语言标准库内建提供了net/http包,涵盖了HTTP客户端和服务端的具体实现.使用net/http包,我们可以很方便地编写HTTP客户端或服务端的程序. http服务端的创建流程 在使用http ...

  8. [刷题] 235 Lowest Common Ancestor of a Binary Search Tree

    要求 给定一棵二分搜索树和两个节点,寻找这两个节点的最近公共祖先 示例 2和8的最近公共祖先是6 2和4的最近公共祖先是2 思路 p q<node node<p q p<=node& ...

  9. mysql 配置文件概述

    mysql 配置文件概述 mysql 配置文件 mysql 的配置文件为 /etc/my.cnf 配置文件查找次序:若在多个配置文件中均有设定,则最后找到的最终生效 /etc/my.cnf --> ...

  10. Mysql数据库基础增删改查常用语句命令

    Mysql增删改查常用语句命令 一.增删改查语句总览 创建: create(创建数据库) 增:insert(插入表数据) 删:drop.delete(删除表.删除表数据) 改:update.alter ...