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

由于您的 VehicleIDVARCHAR(64),因此您应该确保 Clients.VehicleIDLocations.VehicleID 使用相同的字符集和相同的排序规则。

关于asp.net - MySQL排序性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2379021/

相关文章:

asp.net - 将我的网站与 BlogEngine.Net 集成

mysql - 如何在mysql中为所有客户选择客户的最终余额

php - Codeigniter 将数据传递给相同的模型函数

asp.net - 列表框 asp.net 中列表项的点

ASP.NET 甲骨文查询

c# - ASP.NET HTTPClient 获取等待激活的请求状态

c# - asp.net动态设置输入按钮的onclick

MySQL存储过程的问题

php - 错误 1005 (HY000) : Can't create table 'db.POSTS' (errno: 150)

javascript - req.user 未定义,但登录工作正常