MySQL table cache的分区方式

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

今天在跑高压力高并发下只读查询时,发现个比较有意思的小问题

先来看看performance schema

root@performance_schema 03:13:45>SELECT COUNT_STAR, SUM_TIMER_WAIT, AVG_TIMER_WAIT, EVENT_NAME FROM events_waits_summary_global_by_event_name where COUNT_STAR > 0 and EVENT_NAME like ‘wait/synch/%’ order by SUM_TIMER_WAIT desc limit 20;
+————-+——————+—————-+—————————————————+
| COUNT_STAR | SUM_TIMER_WAIT | AVG_TIMER_WAIT | EVENT_NAME |
+————-+——————+—————-+—————————————————+
| 794349716 | 9217250429384944 | 11603268 |wait/synch/mutex/sql/LOCK_table_cache |
| 395819330 | 8052052171747844 | 20342452 | wait/synch/rwlock/sql/LOCK_grant |
| 18792871674 | 3690042369314320 | 196200 | wait/synch/mutex/sql/THD::LOCK_query_plan |
| 11274795644 | 2143435212448448 | 190096 | wait/synch/mutex/sql/THD::LOCK_thd_data |

可以看到,目前排名最高的是LOCK_table_cache。 从backtrace中发现如下堆栈(简化版本):

18 __lll_lock_wait(libpthread.so.0)…,lock(thr_mutex.h:61),

open_table(thr_mutex.h:61),open_and_process_table(sql_base.cc:4903),open_tables(sql_base.cc:4903),

open_normal_and_derived_tables(sql_base.cc:6084),execute_sqlcom_select(sql_parse.cc:5004),……

大量线程被堵塞在open_table这里了,我们来看看具体的代码 (quoted from 5.7.5, sql/sql_base.cc)

3172 retry_share:

3173   {

3174     Table_cache *tc= table_cache_manager.get_cache(thd);

3175

3176     tc->lock();

3177

3178     /*

3179       Try to get unused TABLE object or at least pointer to

3180       TABLE_SHARE from the table cache.

3181     */

3182     table= tc->get_table(thd, hash_value, key, key_length, &share);

3183

我们知道从5.6开始可以对table cache进行分区,参数table_open_cache_instances来控制分区的个数,从而消除了之前版本的热点锁LOCK_open.

之前没看过这部分的代码,一直以为是根据表名之类的来进行分区的,今天才发现是根据线程id进行分区.

155   /** Get instance of table cache to be used by particular connection. */

156   Table_cache* get_cache(THD *thd)

157   {

158     return &m_table_cache[thd->thread_id() % table_cache_instances];

159   }

这种分区方式可以避免例如热点表这样的场景,但也可能带来负面的影响,例如别的分区里可能有大量空闲的TABLE对象,而当前线程的分区中没有,这种情况下依然要创建TABLE对象加入到当前分区中。

另外LOCK_open并不是能完全避免的,当无法从table cache中找到TABLE对象时,依然要持有LOCK_open来检查TABLE_SHARE的版本是否是有效的。不过创建TABLE对象及加入hash的过程无需持有LOCK_open。


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
存储 关系型数据库 MySQL
MySQL技能完整学习列表5、数据库操作——1、创建数据库和表——2、修改表结构(ALTER TABLE)
MySQL技能完整学习列表5、数据库操作——1、创建数据库和表——2、修改表结构(ALTER TABLE)
228 0
|
24天前
|
SQL 监控 关系型数据库
MySQL如何查看每个分区的数据量
通过本文的介绍,您可以使用MySQL的 `INFORMATION_SCHEMA`查询每个分区的数据量。了解分区数据量对数据库优化和管理具有重要意义,可以帮助您优化查询性能、平衡数据负载和监控数据库健康状况。希望本文对您在MySQL分区管理和性能优化方面有所帮助。
67 1
|
2月前
|
SQL 关系型数据库 MySQL
MySQL 8.0报错--1118-Row size too large. The maximum row size for the used table type, not counting BLOBs,is 8126,
MySQL 8.0报错--1118-Row size too large. The maximum row size for the used table type, not counting BLOBs,is 8126,
MySQL 8.0报错--1118-Row size too large. The maximum row size for the used table type, not counting BLOBs,is 8126,
|
1月前
|
存储 关系型数据库 MySQL
MySQL 如何查看每个分区的数据量
MySQL 如何查看每个分区的数据量
32 3
|
1月前
|
SQL 关系型数据库 MySQL
MySQL异常一之: You can‘t specify target table for update in FROM clause解决办法
这篇文章介绍了如何解决MySQL中“不能在FROM子句中指定更新的目标表”(You can't specify target table for update in FROM clause)的错误,提供了错误描述、需求说明、错误做法和正确的SQL写法。
475 0
|
6月前
|
缓存 关系型数据库 MySQL
MySQL查询优化:提速查询效率的13大秘籍(合理使用索引合并、优化配置参数、使用分区优化性能、避免不必要的排序和group by操作)(下)
MySQL查询优化:提速查询效率的13大秘籍(合理使用索引合并、优化配置参数、使用分区优化性能、避免不必要的排序和group by操作)(下)
294 0
|
4月前
|
DataWorks 安全 关系型数据库
DataWorks产品使用合集之如何实现MySQL数据库的自动分区
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
5月前
|
关系型数据库 MySQL 数据库
【MySQL】MySQL数据库的delete from table和truncate table之间的区别
【MySQL】MySQL数据库的delete from table和truncate table之间的区别
636 1
|
5月前
|
分布式计算 DataWorks 关系型数据库
DataWorks产品使用合集之当需要将数据从ODPS同步到RDS,且ODPS表是二级分区表时,如何同步所有二级分区的数据
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
64 7
|
5月前
|
存储 缓存 关系型数据库
心得经验总结:理解MySQL——并行数据库与分区(Partion)
心得经验总结:理解MySQL——并行数据库与分区(Partion)
44 0

热门文章

最新文章

下一篇
无影云桌面