Php MYSQL查询锁定服务器

Php MYSQL查询锁定服务器,php,mysql,Php,Mysql,当尝试执行此查询时,我的mysql服务器cpu使用率达到100%,页面暂停。我在上面设置了一个索引(客户代码、日期时间、时间戳、活动代码、员工姓名、ID交易),但似乎没有帮助。我接下来可以采取哪些步骤来解决此问题?此外,数据库上已经有一个索引(如果这很重要的话)。谢谢 下面是这个查询的作用 数据库信息 ID_Transaction | Client_Code | Employee_Name | Date_Time |Time_Stamp| Activity_Code 1

当尝试执行此查询时,我的mysql服务器cpu使用率达到100%,页面暂停。我在上面设置了一个索引(客户代码、日期时间、时间戳、活动代码、员工姓名、ID交易),但似乎没有帮助。我接下来可以采取哪些步骤来解决此问题?此外,数据库上已经有一个索引(如果这很重要的话)。谢谢

下面是这个查询的作用

数据库信息

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   



 $sql = "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"; 
有没有更好的方法来编写这个查询,这样就不会让我的系统陷入困境?对于10个数据库条目,查询可以正常工作,但当数据库有300000个条目时,它会锁定我的服务器

谢谢 埃里克

+----+--------------------+-------------+--------+------------------------+--------------+---------+----------------+------+----------+----------------------------------------------+
|id |选择|类型|类型|可能的|键|键|列|参考|行|过滤|额外|
+----+--------------------+-------------+--------+------------------------+--------------+---------+----------------+------+----------+----------------------------------------------+
|1 |主| |所有|[NULL]|[NULL]|[NULL]|[NULL]|[NULL]|[NULL]|[NULL]| 8 | 100.00 |使用临时命令;使用文件排序|
|1 |主| m |索引|[NULL]|搜索索引| 924 |[NULL]| 21 | 100.00 |使用where;使用指数;使用连接缓冲区|
|3 |依赖子查询| mi | ref |搜索索引,辅助|搜索索引| 18 | md.Client | u代码| 3 | 100.00 |使用where;使用临时设备;使用文件排序|
|2 |派生|事务|索引|[NULL]|次要| 918 |[NULL]| 21 | 38.10 |使用索引|
+----+--------------------+-------------+--------+------------------------+--------------+---------+----------------+------+----------+----------------------------------------------+

用多个
分组,而不是所有的子查询来简化事情,怎么样。。。。比如:

SELECT * FROM Transaction WHERE Date_Time=CURdate() AND Time_Stamp!='' AND Activity_Code != '000001' GROUP BY Client_Code, Employee_Name

若我正确理解了您的查询,那个么这样做可以解决问题并避免子查询的需要。

使用多个
分组方式而不是所有子查询来简化事情怎么样。。。。比如:

SELECT * FROM Transaction WHERE Date_Time=CURdate() AND Time_Stamp!='' AND Activity_Code != '000001' GROUP BY Client_Code, Employee_Name

如果我正确地理解了您的查询,那么这样做可以解决问题并避免子查询的需要。

您肯定希望执行联接而不是子选择

另外,您正在查看多少记录?分页和使用限制是不可能的吗


如果您将使用内部/外部联接修改的初始查询设置为视图,并且它不会崩溃,那么您将更进一步。设置视图后,您将能够使用一个简单得多的select语句—可能已分页。

您肯定希望执行联接而不是子选择

另外,您正在查看多少记录?分页和使用限制是不可能的吗


如果您将使用内部/外部联接修改的初始查询设置为视图,并且它不会崩溃,那么您将更进一步。设置视图后,您将能够使用一个简单得多的select语句—可能已分页。

在该查询前面运行一个
EXPLAIN EXTENDED
,并发布输出。这将为我们提供有关索引的详细信息。发布您的解释计划,显示来自的索引,并描述如果您的事务表有300000个条目,那么根据您在此表上的子选择中的where语句返回多少条?如果数量很多,您很可能希望执行联接,而不是使用子选择。一般来说,您可能还是希望进行连接,但特别是当有大量行时,subselect的速度会非常慢。您对这个MYSQL服务器有哪些硬件规格?多少公羊?etc500mb ram 2ghz cpu。它是一台虚拟机,在该查询前面解释扩展的
,然后发布输出。这将为我们提供有关索引的详细信息。发布您的解释计划,显示来自的索引,并描述如果您的事务表有300000个条目,那么根据您在此表上的子选择中的where语句返回多少条?如果数量很多,您很可能希望执行联接,而不是使用子选择。一般来说,您可能还是希望进行连接,但特别是当有大量行时,subselect的速度会非常慢。您对这个MYSQL服务器有哪些硬件规格?多少公羊?etc500mb ram 2ghz cpu。这是一台虚拟机器如何让他们正常化显示他们如何让他们正常化我的印象是,如果MySQL中有任何优化的话,视图并没有增加太多。当然,它们可能会使某些查询看起来更简单,但我经常听说它们会降低性能。这只是近年来发生变化的旧MySQL ISM之一,还是仍然如此?视图将索引,因此一旦运行一次,它将被优化以再次运行,而不必显式地重建数据。如果查询很大,并且每次都需要显式构建,那么它将占用更多资源。MySQL不会。当然,它可以缓存部分查询,但它不会为视图构建索引或任何内容。如果你想做到这一点,最好是建立一个汇总表,并通过多个触发器使其保持最新状态……我的印象是,如果MySQL中有任何优化的话,视图并没有添加太多内容。当然,它们可能会使某些查询看起来更简单,但我经常听说它们会降低性能。这只是最近改变的MySQL旧ISM之一吗