Asp.net MySQL排序性能问题
我有一个带有子查询的查询,但子查询表有大约500.000条记录,运行此查询需要的时间太长。如何加快查询速度?任何建议:Asp.net MySQL排序性能问题,asp.net,mysql,Asp.net,Mysql,我有一个带有子查询的查询,但子查询表有大约500.000条记录,运行此查询需要的时间太长。如何加快查询速度?任何建议: SELECT ID, VehicleID, Plate, VehicleType, COALESCE( (SELECT EngineState FROM Locations WHERE Locations.VehicleID = Clients.VehicleID ORDER BY ID DESC LIMIT 1),
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)
,因此您应该确保客户端.VehicleID
和位置.VehicleID
使用相同的字符集和排序规则。连接中使用的所有列都需要索引以及UserClient中的UserID
在Select上进行的查询大大降低了执行时间。以下查询将提高性能
SELECT c.ID, c.VehicleID, c.Plate, c.VehicleType,
IFNULL(l.enginestate, 0) AS enginestate
FROM Clients c
JOIN (
SELECT MAX(ID) AS ID, vehicleID
FROM Locations
GROUP BY vehicleID
) ll
ON ll.VehicleID = c.VehicleID
JOIN Locations l
ON ll.ID = l.ID
JOIN UserClients uc
ON uc.clientID = c.ID
WHERE uc.UserID=@UserID
另外,当只获取一个字段的值时,我更喜欢IFNULL合并。位置表引擎也是MyISAM。@Hasan:MyISAM也可以。如果您的代码>车辆ID 没有公共前缀,您可能会考虑禁用表上的键压缩。