Mysql查询需要5分钟以上

时间:2015-08-06 13:37:08

标签: c# mysql database database-performance

我有一个拥有多个表的MySQL数据库。有问题的SQL查询将花费超过5分钟的时间来执行。查询的一个表是“设备信息”和“设备信息”。并且有超过2100万条记录。

执行此查询的(C#)应用程序在执行查询期间收到超时。

我在My.ini中为MySQl增加了innodb_buffer_pool_size = 64M到1G。

如何减少执行时间。

SELECT DISTINCT(pd.PatientId)   FROM DeviceInfo di   
  JOIN DeviceSession ds ON ds.DeviceSessionID = di.ByDevSessionId   
  JOIN UserSession us ON us.UserSessionId = ds.ByUserSessionId   
  JOIN PatientDetails pd ON pd.PatientDetailsId = us.ByPatientId   
  WHERE   di.SyncStatus = 0   ORDER BY us.UserStartSessionTime  Desc 

DeviceInfo表有21,850,806条记录

2 个答案:

答案 0 :(得分:1)

由于您只想查看PatientId表格中的不同PatientDetails,请尝试将所有Joins转换为exists,其性能优于加入

另外,如果您只想查看不同订单的order by

,则可以删除最后的PatientId

SELECT pd.PatientId
FROM   PatientDetails pd
WHERE  EXISTS (SELECT 1
               FROM   UserSession us
               WHERE  pd.PatientDetailsId = us.ByPatientId
                      AND EXISTS (SELECT 1
                                  FROM   DeviceSession ds
                                  WHERE  us.UserSessionId = ds.ByUserSessionId
                                         AND EXISTS (SELECT 1
                                                     FROM   DeviceInfo di
                                                     WHERE  ds.DeviceSessionID = di.ByDevSessionId
                                                            AND di.SyncStatus = 0)))
GROUP  BY pd.PatientId 

答案 1 :(得分:0)

您是否在要加入的列以及where子句中的列上有索引?在查询之前使用“EXPLAIN SELECT ...”这个词,看看mysql cli中输出的是什么,它会让你知道它是在进行全表扫描还是......