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

目录

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

    • 1 Internal Locking Methods
    • 2 Metadata Locking
    • 3 External Locking

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命令也可能会导致这种情况,需要特别注意下。

原文地址:https://www.cnblogs.com/seancheer/p/11505094.html

时间: 2024-12-25 18:25:47

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

【cocos2d-js官方文档】十二、对象缓冲池12月12日

cc.pool的使用场景 经常创建和销毁的元素,例如打飞机游戏里面的子弹等. 不适用的场景:不是很经常创建的物体,比如背景,建筑等. 如何使用cc.pool 让你的类支持cc.pool 首先,你需在需要使用cc.pool来管理的类中实现reuse和unuse方法,cc.pool在执行putInPool时将调用该对象的unuse方法,可以在unuse中完成进入回收池前的操作,reuse是当你要从回收池中取出对象时的重新初始化操作,你可以将这个对象初始化为重新可用的状态. var MySprite

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

cc.pool的使用场景 经常创建和销毁的元素,例如打飞机游戏里面的子弹等. 不适用的场景:不是很经常创建的物体,比如背景,建筑等. 如何使用cc.pool 让你的类支持cc.pool 首先,你需在需要使用cc.pool来管理的类中实现reuse和unuse方法,cc.pool在执行putInPool时将调用该对象的unuse方法,可以在unuse中完成进入回收池前的操作,reuse是当你要从回收池中取出对象时的重新初始化操作,你可以将这个对象初始化为重新可用的状态. var MySprite

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

目录 Mysql优化(出自官方文档) - 第八篇(索引优化系列) Optimization and Indexes 1 Foreign Key Optimization 2 Column Indexes 3 Column Indexes && Multiple-Column Indexes 4 Comparison of B-Tree and Hash Indexes 5 Use of Index Extensions 6 Invisible Indexes 7 Descending In

Android 官方文档:(二)应用清单 —— 2.26 <uses-permission>标签

syntax: <uses-permission android:name="string"         android:maxSdkVersion="integer" /> contained in: <manifest> description: Requests a permission that the application must be granted inorder for it to operate correctly.

Android官方文档training中英文翻译目录大全:29篇已翻译,45篇未翻译

Android官方文档training中英文翻译目录大全:29篇已翻译,45篇未翻译 1. Getting Started Building Your First App: 原文: https://developer.android.com/training/basics/firstapp/index.html译文:http://wiki.eoeandroid.com/Building_Your_First_AppAdding the Action Bar:原文:https://develope

Android 官方文档:(二)应用清单 —— 2.2 &amp;lt;action&amp;gt;标签

syntax: <action android:name="string" /> contained in: <intent-filter> description: Adds an action to an intent filter.An <intent-filter> element must contain one or more <action> elements. If it doesn't contain any, noIn

【cocos2d-js官方文档】十九、Cocos2d-JS单文件引擎使用指引

这篇指引主要介绍如何使用从在线下载工具下载下来的Cocos2d-JS的单文件引擎. 你有可能下载了下面三个版本中的一个: Cocos2d-JS Full Version: 完整版引擎包含Cocos2d-JS引擎的所有功能特性以及所有扩展,使用这个版本可以帮助你发掘Cocos2d-JS令人惊艳的创造力和可能性.你可以从官方文档首页中查看Cocos2d-JS所支持的特性列表. Cocos2d-JS Lite Version: 精简版本只包含Cocos2d-JS的核心特性,它的优势是稳定,轻量,简单易

一起学微软Power BI系列-官方文档-入门指南(7)发布与共享-终结篇+完整PDF文档

接触Power BI的时间也只有几个月,虽然花的时间不多,但通过各种渠道了解收集,谈不上精通,但对一些重要概念和细节还是有所了解.在整理官方文档的过程中,也熟悉和了解了很多概念.所以从前到后把微软官方的入门稳定粗略的介绍了一下.本篇文章也是这个小系列的终结篇.我将所有的章节整理为了一个完整的PDF文档分享给大家.其实了解之后发现文档还是有些简单的,过程其实没介绍到.因为微软也提供了支持文档,但限于篇幅太大,我就不打算按照原文一个个复制给大家了.入门文档是让大家有个粗略的了解.技术文档就是细节了,

看懂mysql执行计划--官方文档

原文地址:https://dev.mysql.com/doc/refman/5.7/en/explain-output.html 9.8.2 EXPLAIN Output Format The EXPLAIN statement provides information about the execution plan for a SELECT statement. EXPLAIN returns a row of information for each table used in the S