【发布时间】: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