针对 mysql 服务器的远程查询需要更多时间(40 秒对 1.8 秒)

remote query against mysql server takes much more time (40s vs 1.8s)

** 检查底部的更新 5 ** - 看起来像是 mysql 连接器的错误。 感谢所有的帮助者改进了我原来的 table :-) 但问题远不止于此。

我有一个简单的查询,在服务器上需要 1.8 秒,但远程连接需要 40 秒。 查询 returns 1 行:

SELECT a, b, c FROM d WHERE cola <= 123456789012345 and 123456789012345 <= colb

服务器是 mysql 8.0.21。 此查询 运行ning 在 workbench 中需要 1.89s

相同的查询 运行在我自己的计算机上,在 navicat 客户端中,根据服务器负载,需要 30 到 60 秒之间的任何时间。

查询 returns 10M 行中的一行 table。

什么可能导致差异(互联网连接是光纤,而且速度很快)? 无论如何要解决这个问题?

解释结果:

** 更新 **

如所述,同一查询在本地或远程访问时在慢速日志上的执行时间不同。 在 linux 服务器上针对 mariadb 的相同查询 运行ning 远程显示本地和远程的良好性能 (2s)。

我猜 windows 上的 mysql 8.0.21 有问题。可能是升级过程导致的?

解释结果:

Select type: Simple 
Type: ALL 
Possible keys: cola, colb cola-colb,colb-cola 
key: null 
key_lenn: null 
rows: 10M 
filtered: 22.58 
Extra:
using WHERE.

** 更新 2 - 显示创建 Table(本地和远程相同)**

CREATE TABLE `d` (
   `cola` decimal(39,0) unsigned DEFAULT NULL,
   `colb` decimal(39,0) unsigned DEFAULT NULL,
   `a` char(2) COLLATE utf8_bin DEFAULT NULL,
   `b` varchar(64) COLLATE utf8_bin DEFAULT NULL,
   `c` varchar(128) COLLATE utf8_bin DEFAULT NULL,
   `d` varchar(128) COLLATE utf8_bin DEFAULT NULL,
   KEY `idx_cola` (`cola`),
   KEY `idx_colb` (`colb`),
   KEY `idx_cola_colb` (`cola`,`colb`),
   KEY `idx_colb_cola` (`colb`,`cola`) USING BTREE
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin

** 更新 3 ** 在关于 myISAM 的评论之后,我将 table 转换为 INNODB。 它有两个作用: A. 现在远程和本地的处理时间几乎相等 B. 它们都是 6-7,而不是像 MyISAM 那样的 2。 C. 糟糕 - 按照@Rick James 的建议修复索引后,我在不到 1 秒的时间内得到了服务器 运行 查询,但远程保持了 7 秒

所以一方面我很高兴我从 40s 下降到 7s,但为什么从本地到远程的性能变得如此糟糕?

** 更新 4 **

我已经为 运行 查询构建了一个小应用程序并将其安装在服务器上 我的应用程序使用 localhost 作为服务器地址需要 7 秒才能 运行 查询。 Workbench 在同一查询上 - 0.9 秒。 从远程地址尝试工作台,它保持 0.9s mysql 8.0.21 的 Navicat / mysql.data 连接器 - 来自远程地址 - 7s! 我不明白为什么会有差异。

** 更新 5 ** 在我自己的电脑上转载。 Workbench 0.9。代码和navicat 7s。 在 bugs.mysql.com

打开了一个错误

** 更新 6 **

性能模式:

来自 workbench 的完全相同的查询:

我推荐这两个 2 列索引:

INDEX(cola, colb)
INDEX(colb, cola)

也有INDEX(cola)INDEX(colb);优化器会错误地更喜欢使用它们。

我假设这两列和常量是时间戳?你正在检查重叠吗?特定查询是否在时间戳的一个“末端”附近搜索?

你有多少内存? table 有多大(以 GB 为单位)?请提供 EXPLAIN SELECT ....

不要使用 MyISAM。它很旧,从 8.0 中删除,优化较少等。

decimal(39,0) -- 真的吗?这些有什么样的价值?这需要 18 个字节。

如果您要指出 8.0 和 MariaDB 之间的优化差异,请更清楚地表明这就是重点。 Workbench 只是一个 UI;它与处理无关 除了 它可能会“快速”交付前几行,从而使您误以为它更快。

从 MyISAM 切换到 InnoDB 时,必须调整 key_buffer_size(更低)和 innodb_buffer_pool_size(更高)。参见 http://mysql.rjweb.org/doc.php/memory

我找到了这个问题的原因。 看起来 WORKBENCH 正在添加到最后发送到服务器限制 0,1000 的查询。 虽然查询只有 returns 1 行,但它在执行时间上有 10 秒的差异 - 添加和不添加。

MariaDB 似乎不受此影响,因为无论是否添加此查询,查询都一样。