【问题标题】:Improving performance of a Specific MySQL Query提高特定 MySQL 查询的性能
【发布时间】:2019-09-16 03:30:16
【问题描述】:

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

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

SHOW FULL TABLES FROM 'xxx' LIKE 'DATASERIES_yyy'

SELECT COUNT(1) FROM 'DATASERIES_yyy'

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

在数据迁移实际开始之前,上述每个查询都在每个“DATASERIES_yyy”表上运行。运行上述两个查询的过程是迁移过程的最大瓶颈。我从 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,因为应用程序在进程开始时写入了四个更新,并在最后删除它们,以便它知道进程正确开始和结束。

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

任何指导表示赞赏。谢谢!

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

【问题讨论】:

  • FWIW,在我看来这更像是一个 dba 问题 (dba.stackexchange.com)
  • 附加信息请求,来自一个 5.7 和一个 5.5。在 pastebin.com 上发布并分享链接。您的 MySQL 主机服务器的 RAM 大小 A) 完整(未编辑)my.cnf 或 my.ini 文本结果: B) SHOW GLOBAL STATUS;至少 24 小时正常运行时间后 C) 显示全局变量; D) 显示完整的处理程序; E) 完整的 MySQLTuner 报告和可选的非常有用的信息,如果可用,包括 - htop OR top OR mytop 用于大多数活动应用程序,ulimit -a 用于 linux/unix 限制列表,iostat -xm 5 3 用于按设备和核心/cpu 的 IOPS计数,用于服务器工作负载调整分析。
  • Windows 版本的 MySQLTuner,pl 可执行文件可在github.com/pmachapman 获取用于安装。将准备好的报告复制到剪贴板并保存到 TEXT 文件以发布到 pastebin.com。

标签: mysql database-performance information-schema database-permissions


【解决方案1】:

您调整的内容应该是有用的,或者至少是无害的。

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

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

后者将列出所有表名、行数的估计,以及其他一些内容。唉,它不一定会为您提供 InnoDB 表的确切行数;这很关键吗?

10K 表意味着单个目录中有 10K(或更多)文件。 Windows 不能很好地处理大目录;建议重新考虑需要这么多表。

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

【讨论】:

    【解决方案2】:

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

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

    如果这不是问题,那么它可能只是对大量表进行权限检查的不可避免的副作用。如果每张桌子有 1/4 秒是显着的延迟,那么它们肯定有很多。

    如果下划线是实际的下划线,LIKE 'DATASERIES_yyy' 部分也让我感到震惊。模式匹配部分可能会减慢大量表的速度。解决这个问题的唯一方法是重命名表,使它们不包含下划线。

    【讨论】:

      猜你喜欢
      • 2011-12-03
      • 2023-04-08
      • 2023-03-14
      • 1970-01-01
      • 2016-08-18
      • 1970-01-01
      • 2013-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多