我有一个包含多个表的MySQL数据库。有问题的SQL查询的执行时间将超过5分钟。一个被查询的表是'DeviceInfo‘,它有超过2100万条记录。
执行此查询的(C#)应用程序在执行查询期间收到超时。
我已经将用于MySQl的My.ini中的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条记录
发布于 2015-08-06 21:41:06
因为您只想从PatientDetails表中检查不同的PatientId,所以请尝试将所有Joins转换为exists,这将具有比Join更好的性能
此外,如果您只想看到没有任何顺序的独特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 发布于 2015-08-06 21:40:58
在要连接的列和where子句中的列上有索引吗?使用单词‘解释性SELECT...’在查询之前,查看mysql cli中的输出,这将让您知道它是在执行全表扫描还是...
https://stackoverflow.com/questions/31857293
复制相似问题