2011-12-07 100 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

相關問題