MySQL:在这种情况下我需要索引吗?

时间:2011-12-07 10:47:14

标签: mysql indexing

我有一个表'客户'和一个子表'订单'。

对于某个视图,我需要为每个客户端显示 last 顺序。

由于你不能在连接中使用L​​IMIT,我首先使用带有LEFT JOIN,GROUP_CONCAT和SUBSTRING_INDEX的复杂解决方案来获取最后一个订单,但这很慢,因为有数百万条记录。

然后我想到只将最后一个OrderID存储在Clients表中,每次Orders表更改时都会通过触发器更新。然后我在这个字段LastOrderID上执行LEFT JOIN到订单。

在这种情况下,LastOrderID字段上的索引是否有用?或者它不会被使用,因为源表总是客户端,所以在这个字段上没有进行排序,搜索等工作?

我问的原因是,实际上它有点复杂,实际上我可能需要大约20种这样的字段。

更新

我的查询现在是:

SELECT * 
FROM Clients AS c 
LEFT JOIN Orders AS o ON o.OrderID=c.LastOrderID 

客户端中LastOrderID的索引是否会提高速度,还是不是必要的?

2 个答案:

答案 0 :(得分:1)

首先,您是否在Order表中有Client外键的索引?

单独这样做应该会大大提高性能。

答案 1 :(得分:0)

也许你的SQL错了?

这是标准的SQL:你需要在Orders表上的(ClientID,OrderID)上使用单个两列索引来加速聚合和自连接

SELECT
    ...
FROM
    (
    SELECT MAX(OrderID) AS LastOrderID, ClientID
    FROM Orders
    GROUP BY ClientID
    ) o2
    JOIN
    Orders o ON o2.LastOrderID = o.ClientID AND o2.OrderID = o.ClientID
    JOIN
    Clients c PN o.ClientID = c.ClientID