最近有同事经常问到一些metadata lock相关的问题,就顺便理一下吧,主要是整理下相关的连接和文档,标题写的有点大
——————————–
最初为了解决著名的bug#989,在MySQL5.5中开始引入了meta data lock;mdl允许一个事务涉及到的表、库信息直到事务结束都被维持,这样如果一条事务内的某个STATEMENT完成后,其他session发出一条DDL就会被阻塞;这解决了DDL/DML并发导致的复制中断问题。
不过用过5.5的人都知道,这玩意儿实际上太令人讨厌了,尤其是那阴魂不散的“wait for global read lock”或者“wait for table lock”之类的。当备份时的大查询,再来个DDL,哐当~故障发生..直接堵死…
在我们的内部alisql-5.5版本中,我们使用的是和facebook类似的办法(好吧,就是我直接从fb port过来的),即增加接口替换掉flush tables with read lock, 只创建一个read view ,外加返回当前binlog位点;另外percona也实现了一种类似的办法来绕过ftwrl,具体点击文档连接以及percona的博客, 不展开说了。
MDL解决了bug#989,却引入了一个新的热点,所有的mdl对象由于存到全局对象里;对于热点,最正常的想法当然是对其进行分区,不过这也是Mark Callaghan在report了bug#66473后才加入的,当时Mark观察到MDL_map::mutex的锁竞争非常高,进而推动官方改变;
在MySQL5.6.8版本,引入了新参数metadata_locks_hash_instances来控制对mdl hash的分区数(Rev:4350);
Oracle的QA dimitrik 对该特性的评测
不过后面的测试又发现哈希函数有问题,类似类似somedb.someprefix1….somedb.someprefix8的hash key值相同,都被hash到同一个桶下面了.相当于hash分区没生效。。。。坑!!具体怎么算的可以看bug#66473后面Dmitry Lenev的分析。
另外Mark也提出了质疑,innodb的hash计算函数比my_hash_sort_bin要更高效, Oracle的开发人员重开了个bug#68487来跟踪该问题,并在MySQL5.6.15对hash key计算函数进行优化,包括fix 上面说的hash计算问题(Rev:5459),使用MurmurHash3算法来计算mdl key的hash值,(有空看看几种hash函数到底哪个性能更好)
往后直到MySQL5.6.18版本都没有针对mdl部分的单独优化;很显然,后面也不会在5.6版本里出现了,因为mdl优化已经在5.7.4版本里展开了。包含3个worklog
1. WL#7304
简化DML操作对MDL锁的持有/释放;大体思路是把MDL锁拆分成两类,一类是DML的mdl(也成为unobtrusive lock),之间互相兼容,另一类是DDL的mdl(也称为obtrusive lock),与其他锁互斥;
针对DML的MDL,避免了复杂的锁检查和对m_waiting/m_granted链表的维护,改而使用计数器的方式来实现(称为fast-path);不过相应的对DDL的MDL锁的管理逻辑就变的复杂了。没有细看,貌似fast-path的mdl在遇到冲突时会进行转换,将其加入到m_granted列表中,并从m_fast_path_state移除
PATCH(Rev:7067, Rev:7129)
2. WL#7305
使用Lock free的hash对象来管理MDL;由于锁冲突被移除,因此metadata_locks_hash_instances及metadata_locks_cache_size在之后的版本中可能被弃用;
基本思路是使用LF_HASH(lock free hash, 而不是分区的hash)来实现MDL_MAP
PATCH(Rev:7249)
3. WL#7306
这个实际上是对WL#7304和WL#的进一步优化,针对dml的mdl锁(也就是所谓fast path),在检查冲突和释放时都需要施加m_rwlock锁,新的改进移除读写锁,改使用原子操作
PATCH(Rev:7586)
这三个worklog是在5.7.4版本中的主要影响性能的大改动之一,官方对MySQL5.7.4的测试数据,这部分的改进必然有所贡献。
后续的新的改进计划目前还没看到,现在worklog上的更新总要等到实现之后才会更新,让我们拭目以待吧…

本文讨论了使用MySQL的Alter Table语句修改表,包括添加/删除列,重命名表/列以及更改列数据类型。

文章讨论了为MySQL配置SSL/TLS加密,包括证书生成和验证。主要问题是使用自签名证书的安全含义。[角色计数:159]

文章讨论了流行的MySQL GUI工具,例如MySQL Workbench和PhpMyAdmin,比较了它们对初学者和高级用户的功能和适合性。[159个字符]

本文讨论了使用Drop Table语句在MySQL中放下表,并强调了预防措施和风险。它强调,没有备份,该动作是不可逆转的,详细介绍了恢复方法和潜在的生产环境危害。

本文讨论了在PostgreSQL,MySQL和MongoDB等各个数据库中的JSON列上创建索引,以增强查询性能。它解释了索引特定的JSON路径的语法和好处,并列出了支持的数据库系统。

文章讨论了使用准备好的语句,输入验证和强密码策略确保针对SQL注入和蛮力攻击的MySQL。(159个字符)


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)