Asp.net MySQL排序性能问题

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),

我有一个带有子查询的查询,但子查询表有大约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)
,因此您应该确保
客户端.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 没有公共前缀,您可能会考虑禁用表上的键压缩。