我有一个拥有多个表的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条记录
答案 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中输出的是什么,它会让你知道它是在进行全表扫描还是......