php - 为什么我的 mysql 查询运行缓慢?

标签 php mysql join max

我有一个查询,它从数据库中获取第二高日期的记录。我的查询运行良好,但执行起来花费了太多时间。我怎样才能快速执行我的查询。

最佳答案

我将采取与其他人有所不同的方式...我是否遗漏了一些东西,或者除了明显的索引优化之外,您的所有联接都在查找的主键上 - 您的标准准确吗?

这就是我的意思...您的最终 WHERE 子句..

   WHERE
         r.client_id IN ( SELECT opinion_id 
                             FROM pacra_client_opinion_relations
                            WHERE client_id = 50 )

您要求 CLIENT_ID 在 OPINION_ID 的选择结果中,但只查找 client_ID = 50 的意见。Opinion_id 的上下文是什么。

表“pacra_client_opinion_relations”中客户与意见的澄清让我们看一下示例数据,如下所示

Opinion_ID    Client_ID   Other...
1             28          ...
2             35          ...
3             50          ...
4             2           ...
5             50          ...
6             6           ...
7             50          ...
8             4           ...

如果您的查询是 client_id = 50 的所有 OPINION_ID,您将返回 OPINION_ID #s 3、5 和 7。由于您的 where 子句在选择 Opinions 时要求 CLIENT_ID,您现在正在获取客户 3 的数据, 5 和 7,与您最初开始查看的客户 #50 无关。

此外...如果您只查找来自“Client_ID = 50”的内容,那么您之前的查询试图获取第二个到最近的通知日期,您正在查询所有客户。如果您为“Client_ID = 50”添加一个 where 子句,那么您将只会得到那些,而不是所有客户的第二次到最近的通知。

澄清 MAX() 小于内部 MAX()。来自评级的前数据你会得到以下......

og_ratings (assuming this data is pre-sorted per client for sample purposes)
client_id  notification_date
13         Sep 5      <- You want THIS entry if it was client 13 included
13         Sep 14     <- Most recent for client 13
28         Sep 1
28         Sep 8
28         Sep 10     <- You want THIS entry if client 28 included
28         Sep 11     <- Most recent for client 28
29         Sep 4      <- You want THIS entry if client 29 included
29         Sep 11     <- Most recent for client 29
43         Sep 16     <- Most recent for client 43 and no prior, 
                         this would never show as only one entry for client
50         Sep 2
50         Sep 9
50         Sep 12     <- You want THIS entry for client 50
50         Sep 15     <- Most recent for client 50

根据样本数据,您会得到...不同的客户可能有明显不同的第二个日期

client_id  notification_date
13         Sep 5
28         Sep 10
29         Sep 4 
50         Sep 12

如果您在 OUTERMOST 查询中只关心客户端 50,而您的实际数据有数百个客户端(甚至数千个客户端),那么您正在查询所有客户端。您可以通过...专门针对客户 50 限制您的内部查询。

 og_ratings r INNER JOIN (
    SELECT 
      client_id, 
      max(notification_date) notification_2nd_date
   FROM 
      og_ratings
   WHERE
      (client_id, notification_date) 
         NOT IN ( SELECT client_id, max(notification_date)
                     FROM og_ratings 
                     GROUP BY client_id )
   GROUP BY 
      client_id
   ORDER BY
      client_id DESC

可以调整为...

 og_ratings r INNER JOIN (
    SELECT 
      client_id, 
      max(notification_date) notification_2nd_date
   FROM 
      og_ratings
   WHERE
      client_id = 50    <--- ADDED TO WHERE CLAUSE for CLIENT 50 ONLY
      AND (client_id, notification_date) 
         NOT IN ( SELECT client_id, max(notification_date)
                     FROM og_ratings 
                     WHERE client_id = 50    <--- ADDED HERE TOO FOR CLIENT 50
                     GROUP BY client_id )
   GROUP BY 
      client_id
   ORDER BY
      client_id DESC

它只会返回第 50 个客户的单条记录,而所有客户的日期都是如此

client_id  notification_date
50         Sep 12

最后,在多次提供 MySQL 查询时,我都提供了使用关键字 STRAIGHT_JOIN 的方法。这基本上告诉 MySQL 按照您告诉它的顺序进行查询......有时(例如您的情况),您有一堆查找表,它可能会尝试为您考虑并首先使用查找表,因为它很低记录计数(或什么/如何)它应用查询。

SELECT STRAIGHT_JOIN ... 查询的其余部分

如果我的假设是准确的,还可以进行更简化的查询,我只是想解释我认为有问题的不同部分……最后,正如您所看到的示例数据,如果您可以准备关于现在和 future 的样本数据以及您想要获得的东西可能会有所帮助...

关于php - 为什么我的 mysql 查询运行缓慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32629305/

相关文章:

mysql - MySQL根据日期选择记录

php - 计算最近城市的最有效方法(来自白名单)

java - 如果我们在 hibernate 中只选择一列或多于一列,我们可以获得相同的返回类型吗?

mysql - 插入到由主键链接的表中

没有虚拟列的不同字段的 MySQL Union

mysql - MySQL 8.0 InnoDB Cluster 死锁 BLOB INSERT

php - 将变量中存储的值与 php 中的 mysql 字段值进行比较

php - GoogleMap 和 WordPress : problems in creating markers dynamically

javascript - $HTTP_RAW_POST_DATA 错误 - 未发布数据

php - 如何根据数据库中的 csv 重新填充/重新选择/自动选择多个选择框值?