针对 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 似乎不受此影响,因为无论是否添加此查询,查询都一样。
** 检查底部的更新 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 似乎不受此影响,因为无论是否添加此查询,查询都一样。