我有一个表'客户'和一个子表'订单'。
对于某个视图,我需要为每个客户端显示 last 顺序。
由于你不能在连接中使用LIMIT,我首先使用带有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的索引是否会提高速度,还是不是必要的?
答案 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