我有一个带有子查询的查询,但子查询表大约有 500.000 条记录,并且运行此查询需要很长时间。我怎样才能加快这个查询的速度?任何建议:
SELECT ID, VehicleID, Plate, VehicleType,
COALESCE(
(SELECT EngineState
FROM Locations
WHERE Locations.VehicleID = Clients.VehicleID ORDER BY ID DESC LIMIT 1),
0
) EngineState
FROM Clients
WHERE ID IN (SELECT ClientID FROM UserClients WHERE UserID=@UserID);
还有 3 列从位置表中查询最后一条记录:
COALESCE(
(SELECT EngineState FROM Locations
WHERE Locations.VehicleID = Clients.VehicleID ORDER BY ID DESC LIMIT 1),
0
) EngineState
正如我所见,对“位置”表中的结果进行排序是性能因素。位置表每分钟填充 1000 辆车的位置数据。 x、y、速度...
最佳答案
创建以下索引:
Locations (vehicleId, id)
UserClients (UserID, ClientID)
并稍微重写您的查询:
SELECT ID, VehicleID, Plate, VehicleType, l.*
FROM Clients
LEFT JOIN
Locations l
ON l.id =
(
SELECT id
FROM Locations li
WHERE li.VehicleID = Clients.VehicleID
ORDER BY
li.VehicleID DESC, li.id DESC
LIMIT 1
)
WHERE Clients.ID IN
(
SELECT ClientID
FROM UserClients
WHERE UserID = @UserID
)
由于您的 VehicleID
是 VARCHAR(64)
,因此您应该确保 Clients.VehicleID
和 Locations.VehicleID
使用相同的字符集和相同的排序规则。
关于asp.net - MySQL排序性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2379021/