提高特定MySQL查询的性能

问题描述 投票:1回答:2

我在需要使用数据库的多个站点上使用企业应用程序。我不是应用程序的开发人员,因此我无法修改应用程序查询数据库的方式。目前,我们正在尝试从MySQL迁移到PostgreSQL,因为它恰好在PostgreSQL上运行得更好。

该应用程序将数据存储在特定数据库实例中的数千个表中。该应用程序具有内置的迁移功能,可将数据从一个数据库供应商(例如MySQL)传输到另一个数据库供应商。 (例如PostgreSQL)在应用程序的迁移过程中,它为实例中的每个表执行以下两个查询:

SHOW FULL TABLES FROM 'xxx' LIKE 'DATASERIES_yyy'

SELECT COUNT(1) FROM 'DATASERIES_yyy'

其中'xxx'是数据库实例,'yyy'是任意的非连续整数。

在数据迁移实际开始之前,上述每个查询都在每个“DATASERIES_yyy”表上运行。运行上述两个查询的过程是FAR迁移过程中最大的瓶颈。我从MySQL的信息架构中看到,运行上述两个查询平均需要0.25秒才能完成,大部分时间花在“检查权限”上。对于功能强大的服务器甚至是我的小型笔记本电脑来说都是如此

我已经在网上搜索了可能会改善这两个查询的性能的方法。因为我无法修改应用程序查询数据库的方式,所以我只能专注于MySQL本身。

我试图加快它们的速度:1。确保innodb_stats_on_metadata已关闭。 2.设置innodb_read_io_threads = 64. 3.确保查询缓存已关闭。 4.删除除应用程序用于登录数据库的1个用户名以外的所有用户。 5.设置query_cache_type = 0. 6.设置innodb_io_capacity = 1000. 7.缓冲池已配置为很久以前使用大约70%的服务器内存。

我不期待任何奇迹,但还有其他我可以尝试帮助这个过程加速吗?

因为MySQL数据库将在迁移完成后被丢弃,所以我能够使用非传统设置只是为了让流程更快,所以可以随意提出被认为是临时或短期的建议。 (显然,数据完整性不会受到影响。)

顺便说一下,我知道我不能使用innodb_read_only,因为应用程序在进程开始时写入四个UPDATES并在结束时删除它们,以便它知道进程正确开始和结束。

这些站点都是在Windows环境中运行的MySQL实例。大多数站点都运行MySQL版本5.7。其他人是5.5。

任何指导赞赏。谢谢!

编辑:1。全局设置用户权限,而不是按表设置。 2.拥有10,000张'DATASERIES_yyy'牌桌并非不典型。是的,下划线在'DATASERIES_yyy'表名中。我无法控制表的命名。

mysql database-performance information-schema database-permissions
2个回答
0
投票

MySQL中的权限可以全局授予,也可以逐表授予。也许该应用程序的用户已被授予对各个表的权限,使得数据量非常大。权限也存储在MyISAM数据库(“mysql”数据库)中,因此InnoDB设置都不会对其性能产生影响。

使用SHOW GRANTS命令检查用户的权限。如果有很多这样的权限,并且如果你是这样做的游戏,则在*.*而不是许多单独的表上授予这些权限。

如果这不是问题,那么对很多表进行权限检查可能只是一个不可避免的副作用。如果每张桌子的四分之一秒显着延迟,那么肯定会有很多。

如果下划线是实际的下划线,那么LIKE 'DATASERIES_yyy'部分是一种模式也让我感到震惊。模式匹配部分可能会减慢大量表格的速度。处理这种情况的唯一方法是重命名表,使它们不包含下划线。


0
投票

你调整的东西应该是有帮助的,或者至少是无害的。

这将在一个步骤中提供所有信息,并且可能总共需要几秒钟:

USE xxx;
SHOW TABLE STATUS LIKE 'DATASERIES%';

后者将列出所有表名,行数估计和其他一些东西。唉,它不一定能为您提供InnoDB表的确切行数;这很重要吗?

10K表表示单个目录中的10K(或更多)文件。 Windows不适合大型目录;建议重新考虑这么多表的必要性。

所有操作都是在一个连接中完成的吗?或者您是否为每张桌子重新连接?重新连接将花费一些成本;无法预测多少。

© www.soinside.com 2019 - 2024. All rights reserved.