1
7
一般来说,如果您的SQL查询能够完全建模您想要做的事情,那么它可能比将它拆分成用PHP(或任何其他语言)粘合在一起的片段更快。 在一定范围内 . 这些界限是:
现在,这并不能解决您的SQL(或在PHP中建议的替代实现)是 最优的 对于你正在做的,但只有当你的应用程序做了什么以及你实际想要达到的终点的更多信息时,你才能解决这个问题。可能没事,也可能不。 在快速浏览您对表结构的更新时,没有任何东西会跳到我身上,因为这很可能是导致性能问题的原因,但是:
|
2
1
应用程序和数据库之间的多次往返?不,与单个查询相比,这不会提供性能奖励。 |
3
1
您不必使用PHP来完成这项工作,您可以使用子查询在一个查询中完成这项工作,也可以使用多查询存储过程。 要查看哪一个更快,请对它们进行基准测试。 |
4
1
奇怪的是,我会不同意这个共识,至少在某种程度上是这样。 首先,你永远不应该使用左连接。这很诱人,但几乎总是个坏主意。我假设在您的案例中,action_6_5pts、action_6_10pts和action_weekly表可能不包含所有成员ID。(我在猜测您的数据,所以如果每个表都保证包含所有成员ID,那么从查询中去掉左键,您就可以了。) 我怀疑有一个更好的方法可以让你的数据在一开始。通常,最好将相同类型的数据合并到一个表中。我不想猜测你的数据,所以我给你一个伪例子。我见过很多时候,人们会将相似的数据分为多个表(较小的表更好吗?)不总是这样。例如,如果您正在构建一个发票系统,那么可能会考虑将发票按月拆分为单独的表。所以你创建发票2010年1月,发票2010年2月…等等,但是如果你想搜索呢?同一个客户可能不是在所有的几个月,所以很难得到一个只有该客户的列表,而不使用左连接。讨厌。我们不喜欢左进!太慢了! 更好的方法是使用一个带有日期的发票表(索引!)以及每个客户ID。任何连接都保证找到发票,除非客户没有发票(这无关紧要)。 现在,在您的情况下,也许您可以在一个表中制作5分和10分的标记,每周是日期吗?我在做假设,不知道更多,很难给你“正确”的答案。 现在我说我不同意这个共识。如果不更改数据,通常情况下,如果有一个非常大的表(如您所说),那么使用in语句将查询拆分为4个比左联接更好。如果您想加快速度,可以使用union将所有4个合并为1个。这应该比左连接还要快。 你也可以很容易地证明这一点。接受您的查询并将关键字explain放在它前面,然后直接在mysql上执行它(使用以下工具之一:命令行、mysql-gui甚至phpmyadmin)。这将给您一个它计划如何将表连接在一起的细目。 对于这个答案,输出的解释太长,但一般来说,每一行输出都会告诉您查询将联接多少行。越小越好。它还将告诉您它将如何加入。”如果可能的话,您希望避免使用“临时”或“使用文件排序”(尽管如果您排序,它会出现,所以请做好准备)。还有一个列,用于说明行将使用什么键联接。如果该列为空,则应尝试创建一个索引以使其更好地工作。 希望有帮助!祝你好运! |
5
0
不要那样做。数据库在连接表和选择相关行方面速度非常快,就像执行大量的单个查询一样快。 |
6
0
在您尝试之前,您不会知道这种方法是否会或在多大程度上提高性能。根据我的经验,将这类查询更改为离散查询并不是可以预测的。您要寻找的是MySQL中的一个转折点,在这里创建超过一定大小的内部表是一个杀手。一旦你知道那一点在哪里 在您的安装中 然后,您可以玩查询拼接和后处理的游戏。 |
7
0
您应该在联接中使用IN子句,而不是使用极限。限制在联接之后运行,而不是作为查询的一部分。 |
8
0
我可能疯了,但我看不到桌子上的索引
这意味着查询必须扫描
向添加索引
您可以创建的组合键(
希望有帮助… |
Hatsune Miku · 比较或if语句是否更快[已关闭] 1 年前 |
Black Swan · 无法解压缩的值太多(应为2)错误 1 年前 |
Kai · 有什么方法可以轻松优化VSCode中的锈迹? 2 年前 |
Balfar · 处理NumPy阵列上的循环最有效的方法是什么? 2 年前 |
Daniel · C#轻松存储快速访问的大型位矩阵 6 年前 |
halbe · 优化音频DSP程序的numpy计算 6 年前 |
Afsara · 是否有任何方法不能优化我们的应用程序? 6 年前 |