Php Mysql查询重做乐趣

Php Mysql查询重做乐趣,php,mysql,Php,Mysql,当尝试执行此查询时,我的mysql服务器cpu使用率达到100%,页面暂停。我在客户代码、日期时间、时间戳、活动代码、员工姓名、ID交易上设置了索引,但似乎没有帮助。现在我需要不同的方法来进行查询,这样就不会对服务器造成太大的负担。下面是我需要它做什么的描述。为了解释,它会在每个客户机代码下查找特定日期的最后一个条目,然后在找到所有条目后再查找。然后计算Eric或Jerry有多少个条目。我需要看看我还不太熟悉的代码。谢谢你的帮助 下面是这个查询的作用 数据库信息 ID_Transaction |

当尝试执行此查询时,我的mysql服务器cpu使用率达到100%,页面暂停。我在客户代码、日期时间、时间戳、活动代码、员工姓名、ID交易上设置了索引,但似乎没有帮助。现在我需要不同的方法来进行查询,这样就不会对服务器造成太大的负担。下面是我需要它做什么的描述。为了解释,它会在每个客户机代码下查找特定日期的最后一个条目,然后在找到所有条目后再查找。然后计算Eric或Jerry有多少个条目。我需要看看我还不太熟悉的代码。谢谢你的帮助

下面是这个查询的作用

数据库信息

ID_Transaction | Client_Code | Employee_Name | Date_Time |Time_Stamp| Activity_Code  
1              | 00001       |  Eric         |  11/15/10 | 7:30AM   |  00023  
2              | 00001       |  Jerry        |  11/15/10 | 8:30AM   |  00033  
3              | 00002       |  Amy          |  11/15/10 | 9:45AM   |  00034  
4              | 00003       |  Jim          |  11/15/10 | 10:30AM  |  00063  
5              | 00003       |  Ryan         |  11/15/10 | 12:00PM  |  00063  
6              | 00003       |  bill         |  11/14/10 | 1:00pm   |  00054    
7              | 00004       |  Jim          |  11/15/10 | 1:00pm   |  00045  
8              | 00005       |  Jim          |  11/15/10 | 10:00 AM |  00045  
查询获取上面的信息,并像这样进行计数。通过每个客户端代码的最新条目。在本例中,查询如下所示。在php之后

Jerry = 1    
2               | 00001       |  Jerry        |   11/15/10 |   8:30AM |   00033     
Amy = 1   
3               | 00002       |  Amy          |   11/15/10 |   9:45AM |  00034   
Ryan = 1  
5               | 00003       | Ryan          |   11/15/10 |   12:00PM | 00063  
Jim = 2  
7               | 00004       | Jim           |   11/15/10 |   1:00pm  | 00045  
8               | 00005       | Jim           |   11/15/10 |   10:00 AM| 00045      
以及查询:

 SELECT m.Employee_Name, count(m.ID_Transaction)   
     FROM ( 
         SELECT DISTINCT Client_Code 
             FROM Transaction
         ) md 
         JOIN Transaction m ON 
             m.ID_Transaction = ( 
                 SELECT ID_Transaction 
                     FROM Transaction mi  
                     WHERE mi.Client_Code = md.Client_Code 
                         AND Date_Time=CURdate() 
                         AND Time_Stamp!='' 
                         AND Activity_Code!='000001'  
                     ORDER BY m.Employee_Name DESC, 
                         mi.Client_Code  DESC, 
                         mi.Date_Time DESC,  
                         mi.ID_Transaction DESC 
                     LIMIT 1 
             )   
         GROUP BY m.Employee_Name    



+----+--------------------+-------------+--------+------------------------+--------------+---------+----------------+--------+----------------------------------------------+
| id | select_type        | table       | type   | possible_keys          | key          | key_len | ref            | rows   | Extra                                        |
+----+--------------------+-------------+--------+------------------------+--------------+---------+----------------+--------+----------------------------------------------+
|  1 | PRIMARY            | <derived2>  | ALL    | [NULL]                 | [NULL]       | [NULL]  | [NULL]         |    347 | Using temporary; Using filesort              |
|  1 | PRIMARY            | m           | index  | [NULL]                 | search index | 924     | [NULL]         |  29255 | Using where; Using index; Using join buffer  |
|  3 | DEPENDENT SUBQUERY | mi          | ref    | search index,secondary | search index | 18      | md.Client_Code |   2926 | Using where; Using temporary; Using filesort |
|  2 | DERIVED            | Transaction | range  | [NULL]                 | search index | 18      | [NULL]         |     10 | Using index for group-by                     |
+----+--------------------+-------------+--------+------------------------+--------------+---------+----------------+--------+----------------------------------------------+
你应该试试跑步

EXPLAIN SELECT m.Employee_Name, count(m.ID_Transaction)   
FROM ( SELECT DISTINCT Client_Code FROM Transaction) md 
JOIN Transaction m
  ON m.ID_Transaction = ( SELECT ID_Transaction FROM Transaction mi  
                          WHERE mi.Client_Code = md.Client_Code AND
                                Date_Time=CURdate() AND 
                                Time_Stamp!='' AND 
                                Activity_Code!='000001'  
                          ORDER BY m.Employee_Name DESC,
                                   mi.Client_Code  DESC, 
                                   mi.Date_Time DESC,
                                   mi.ID_Transaction DESC LIMIT 1 
                        )  
GROUP BY m.Employee_Name
获取查询优化器如何处理查询的指示

我注意到你在同一张桌子上打了3次。我猜这会给优化器带来一些挑战


编写一个更简单的SQL查询,然后使用PHP将其缩减到您所要查找的内容,这可能更有意义。

试试这个,看看大小

SELECT m.Employee_Name, count(m.ID_Transactions) AS transactions
    FROM Transaction AS m
    JOIN (
        SELECT sub1.Client_Code, MAX(sub1.Activity_Code) AS ActivityMax
            FROM Transactions AS sub1
            WHERE Date_Time = CURdate()
                AND Time_Stamp != ''
                AND Activity_Code != '000001'
            GROUP BY sub1.Client_Code
    ) AS m2 ON m.Client_Code = m2.Client_Code 
        AND m.Activity_Code = m2.ActivityMax
    GROUP BY m.Employee_Name

运行查询,并将结果发回……您已经在这里问过这个问题:@James,他显然有不同的意见!也许他换了个逗号神圣的蝙蝠侠!天哪!我想我从来没有在ON子句中看到过子查询!怪不得这么慢!我发布了你在上面所问的。这不是拉任何信息。不确定为什么选择“活动\ U代码”,但“活动\ U代码”应仅用于排除计数。任何带有000001的活动代码都不计入我的查询中。