我已经设置了 3 台连接到路由器的机器(通过 WI-FI)。我在具有大量内存的 Core I7 机器上安装了 MySQL 服务器。并且正在从其他机器查询以从服务器提取数据。
在一个包含 100000 多个条目的表上,查询在服务器上执行需要 0.4 秒,但在客户端机器上执行相同的查询却需要将近 3 秒。
我遗漏了什么?为什么从客户端计算机执行相同的查询 (select * from tableName) 会花费这么多时间。
感谢您的评论。我已经在两台机器上测试了相同的查询,将限制设置为 10 行。所用时间不到 0.01 毫秒。因此,对于较短的数据集,时间是一致的,但是当查询完整的表时,时间会有显著差异。
我的理论网络速度是 150 MBps,但查询仍然需要很长时间。有什么建议可以改善这种情况吗?使用交换机并将所有机器连接到交换机?这能解决问题吗?
服务器和客户端上没有其他进程正在运行。我已关闭所有应用程序并尝试调试缓慢问题。提前致谢。
答案1
select * from tableName
是一个非常模糊的查询(从表中获取所有数据)。如果表的长度超过 100000 行,则服务器可能返回大量数据。如果返回的数据的总大小很大,则将其传输到远程计算机所需的时间将比将其转储到本地服务器要长得多。
尝试提高查询的精度,以便返回更少的数据。例如,如果您只需要表中的“姓名”和“地址”,请尝试类似的方法,Select Name,Address from tableName
这样您就不会得到一堆您不会使用的字段/数据。
显著提高速度的(唯一)其他方法是增加服务器和客户端之间的网络连接速度。
答案2
可能缺少的是您查询数据库的方式......例如,未知客户端是否从服务器“拉”所有数据[并且可能锁定表]然后显示结果 -vs-服务器仅提供必要的数据[并且不锁定表,或仅锁定服务器请求的内部数据]。
关于锁定和“提取”的数据量...这取决于您如何执行查询...关于锁定,这取决于默认设置;因为在某些情况下,即使是选择查询也可能需要锁定表以确保对长时间运行的查询进行有效聚合...此外,当您谈论 JOIN 时,它是在本地客户端内存中还是在服务器上“连接”?两者都有业务案例。通常,在像您这样的情况下(有大量数据正在操作),它是 SPROC 和 UDF(用户定义函数)的理想情况。您是否尝试过创建 SPROC 和 UDF?(仅传回结果和/或状态。)
我想要尝试做的是从远程 PC 运行一个存储过程(其内部具有与客户端的“手动”SQL 完全相同的 SQL),看看是否仍然有这样的滞后。
如果这不能解决问题,那么您确实需要包含更多具体细节,不仅仅是查询,还包括在远程 PC 上查询时使用的“堆栈”。