2011-12-07 66 views
2

我有一个表'客户'和一个子表'订单'。MySQL:在这种情况下我需要索引吗?

对于某个视图,我需要为每个客户显示最后订单。

由于您无法在连接中使用L​​IMIT,因此我首先使用了一个带有LEFT JOIN,GROUP_CONCAT和SUBSTRING_INDEX的复杂解决方案来获取最后的订单,但是这非常缓慢,因为有数百万条记录。

然后,我想只是将最后一个OrderID存储在客户表中,每当Orders表发生变化时都会通过触发器进行更新。然后,我只需在该字段的LastOrderID上执行LEFT JOIN即可。

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

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

更新:

我现在查询是:

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

会在客户端上LastOrderID指数提高速度,或者是不是neccessary?

回答

1

首先,您是否在订单表中的客户端外键上有索引?

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

+0

我有一个正常的指标在订单中的ClientID上。虽然我没有使用外键。这会提高性能,还是外键只对数据完整性重要? – Dylan

+0

不是必需的。只要检查你的基础知识是否已完成,订单中的clientID上的索引就不会是等待发生的可伸缩性问题。我建议在ClientID和OrderNumber DESC上都有关键字,这样服务器只需检查客户端命令块的开始,然后找到它找到的第一行。涉及的读取量较少。 – KingCronus

0

也许你的SQL错了?

这是标准的SQL:你需要Orders表上(客户端ID,订单ID),单个的两列索引此,这将加快聚集和自加入

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 
+0

我莫名其妙地不喜欢自连接和复杂的分组。我的查询很简单:SELECT * FROM Clients AS c LEFT JOIN Orders AS o ON o.OrderID = c.LastOrderID – Dylan

+0

这是您如何在SQL中为每个父级有效的“最新子级”或“每个组的最高级1”。其他rdbms更好,但MySQL限制了你 – gbn

相关问题