MySQL和雷竞技下载官网用于MySQL的Percona服务器,有一个名为information_schema (I_S)的模式,它提供关于数据库表、视图、索引等的信息。
可以从这个模式检索许多有用的信息,例如表元数据和外键关系,但是如果服务器负载过重,尝试查询I_S可能会导致性能下降,如下例测试所示。
免责声明:这篇博文旨在展示一个不太为人所知的问题,但并不是一个严肃的基准。退化的百分比取决于许多因素(硬件、工作负载、表数量、配置等)。
测试
该测试比较了服务器在“高负载但没有I_S查询”和“高负载+ I_S查询”时的行为基线,以检查性能是否下降。
同样的测试已经在MySQL 5.7和8.0的Percona服务器上执行。雷竞技下载官网针对I_S执行的检查性能下降的查询检查一些表fk(外键)关系的信息。
设置
设置包括使用sysbench创建10K表,并向20个表添加20个fk。
硬件
cpu数量:12个
内存大小:12288mb
在my.c雷竞技下载官网nf中调整MySQL配置变量的主要Percona服务器:
|
1
2
3.
4
5
6
|
开放-文件-限制
=
65535
表格-定义-缓存
=
4096
表格-开放-缓存
=
2000
Table_open_cache_instances
=
1
Innodb-缓冲-池-大小
=
10克
Innodb_buffer_pool_instances
=
2
|
你可以在这里查看完整的my.cnf文件:https://github.com/ctutte/blog_IS/blob/master/my.cnf
执行查询
为了生成数据库设置,我使用sysbench和以下标志:
|
1
2
3.
4
|
sysbench
--db-司机=mysql
--mysql-用户=根
--mysql-密码=123456 ab
!
--mysql-db=测验
--range_size=One hundred.
--table_size=2250
--表=10000
--线程=12
--事件=0
--时间=120
--兰德-类型=统一的
/usr/分享/sysbench/oltp_read_only
.lua
准备
|
然后手动创建20个fk:
|
1
2
3.
4
|
改变
表格
sbtest1
添加
外国
关键
(
id
)
参考文献
sbtest8001
(
id
)
;
改变
表格
sbtest2
添加
外国
关键
(
id
)
参考文献
sbtest8002
(
id
)
;
...
{
重复
20.
次
}
|
在场景设置好之后,我用下面的查询执行了三次sysbench:
|
1
2
3.
4
|
sysbench
--db-司机=mysql
--mysql-用户=根
--mysql-密码=123456 ab
!
--mysql-db=测验
--range_size=One hundred.
--table_size=2250
--表=1000
--线程=10
--事件=0
--时间=60
--兰德-类型=统一的
/usr/分享/sysbench/oltp_read_write
.lua
--报告-时间间隔=1
运行
|
为了查询I_S,我使用了下面的bash命令行,它在bash的while循环中检查FK:
|
1
2
|
而
真正的
;
做
{
mysql
-u
根
-p123456Ab
!
-e
"选择
TABLE_NAME
,
COLUMN_NAME
,
CONSTRAINT_NAME
,
REFERENCED_TABLE_NAME
,
REFERENCED_COLUMN_NAME
从
INFORMATION_SCHEMA
.KEY_COLUMN_USAGE
在哪里
REFERENCED_TABLE_SCHEMA
是
不
零";
}
;
完成
|
考虑到服务器有12个vcpu, sysbench使用10个vcpu,那么有一些空闲的CPU容量用于运行对I_S的查询,对吗?让我们看看结果。
Percona Serv雷竞技下载官网er for MySQL 5.7的结果
三次,每次60秒,1000张桌子:
| 总查询 | 每秒 | |
| 没有FK检查 | 8337600 | 46320 |
| 使用FK检查 | 6924900 | 38472 |
可以看到,在服务器上只运行sysbench,每秒可以执行46320个查询。
在连续检查sysbench + I_S查询来检查fk的场景中,每秒执行38472个查询。即(46320 - 38472)* 100 / 46320 = 16.9%的性能下降。
如果I_S查询受到CPU限制,那么我期望服务器能够执行超过46320个QPS,但是发生了一些事情,实际上,QPS的数量确实下降了。
这种性能下降的原因是查询I_S需要从文件中打开表(受table_open_cache变量限制)。
在我的示例测试中,当只运行sysbench时,工作负载显示很少Table_open_cache_misses(第一列为初始值,每个后续值为每秒增量)。
Table_open_cache_misses while NOT checking for FKs:
|
1
|
58437
28
15
13
7
5
7
6
1
0
0
1
0
3.
8
10
5
0
0
0
0
0
0
1
0
5
0
6
5
7
5
4
0
2
2
4
6
1
0
0
0
0
0
0
0
0
0
0
0
|
然而,当运行sysbench + I_S查询时,由于MySQL/Percona Server for MySQL 5.7必须打开每个table.frm,有更多的Table_open_cache_misses(在我的测试运行雷竞技下载官网中,我故意读取了非常多的表,而不是“Table-open-cache”变量)。
检查fk时的Table_open_cache_misses:
|
1
|
68133
30.
31
33
30.
32
31
31
29
32
28
32
30.
3230
33
31
30.
31
28
31
31
33
32
33
29
33
34
32
31
33
30.
28
34
33
30.
29
29
29
25
30.
31
29
33
27
29
29
28
28
|
以上输出是使用pt-stalk+pt-mext从雷竞技下载官网Percona工具包.
这也可以看到使用雷竞技下载官网Praybet雷竞技竞猜在线官网ercona监控和管理(PMM)和查看“MySQL概述”仪表板->“MySQL表打开缓存状态”图形。
当只运行sysbench时,缓存命中次数很高(~99.98%),而“未命中”次数很少,这意味着table_cache足够大,可以满足工作负载。

然而,当运行sysbench + I_S查询时,当FK检查执行到~15:35:00时,在~15:33:40缓存命中的数量减少了,这也显示了在测试期间(表)“打开”和“错过”的增加。


如果满足以下条件,可以最小化I_S查询时的性能下降:
- Table_open_cache增加
- 在某些列上使用“WHERE”条件以避免datadir/database文件夹扫描。你可以在官方文档中阅读一些优化示例:https://dev.mysql.com/doc/refman/5.7/en/information-schema-optimization.html.
Percona Serv雷竞技下载官网er for MySQL 8.0结果
对于MySQL和Percon雷竞技下载官网a Server For MySQL 8,执行sysbench + I_S查询显示几乎没有缓存丢失,如下图所示:

MySQL 8改进数据字典访问,这避免了必须打开所有表.frm文件。这个改进已经移植到MySQL 8的Percona服务器。雷竞技下载官网
结论
总之,从5.7 I_S中检查表信息依赖于从磁盘打开.frm文件来检索表信息,当打开的表的数量不适合table_cache时,这会导致性能下降。
如果你严重依赖于对information_schema的查询,那么你的工作负载将受益于升级到MySQL/Percona Server for MySQL 8,因为新的数据字典格式。雷竞技下载官网当您使用5.7时,您还可以考虑增加table_open_cache以避免table_misses,或者至少对“WHERE”子句使用一些过滤器以避免打开所有.frm文件,并将查询限制在表的子集以限制性能影响。
雷竞技下载官网Percona Distribution for MySQL是最完整、稳定、可扩展和安全的开源MySQL解决方案,为您最关键的业务应用程序提供企业级数据库环境……而且它是免费使用的!

想要每周更新最新的博客文章?
现在订阅,我们将在每周五东部时间下午1点向您发送最新消息。
相关博客文章
推荐的文章
2023年3月29日
桑托什Varma
MongoDB中的压缩方法:Snappy vs. Zstd
2023年3月29日
Smit Arora
修复分区表中错位的行
2023年3月28日
Divyanshu索尼
WiredTiger日志和检查点机制
最受欢迎文章
2023年1月17日
谢尔盖Pronin
使用Percona Advisors确保数据库安全雷竞技下载官网
2023年2月10日
马塞洛•阿尔特曼
雷竞技下载官网Percona XtraBackup现在支持IAM实例配置文件
2023年2月10日
拉蒂。乔杜里
雷竞技下载官网Percona XtraBackup和MySQL 5.7等待刷新表状态查询