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