2012-05-13 34 views
0

我在大約1,500行的表的存儲過程中運行一個簡單的SELECT(下面註明)。VB.NET MySqlDataAdapter.Fill大約需要6-7秒

CREATE PROCEDURE `LoadCollectionItemProperty`(IN sId int(10)) 
BEGIN 
SELECT * 
FROM itemproperty 
WHERE itemid IN 
    (SELECT itemid 
    FROM collectionitem 
    WHERE collectionid = sId AND removed ='0000-00-00 00:00:00'); 
END 

該操作大約需要7秒。我插入斷點並使用F11來確定MySqlAdapter.Fill是滯後時間的起點。我的計算機和託管MySQL數據庫的服務器都不會受到特定的挑戰。我猜這是查詢本身。

collectionitem擁有2個外鍵將itemproperty鏈接到集合。我們提供了sproc sId(集合的PK),以便子查詢返回特定集合中的所有itemid,然後我們在itemproperty中使用itemid(PK)。

有什麼辦法可以加快這個過程嗎?

UPDATE

我的問題完全是由於索引不當。一旦我瞭解了需要索引的列,一切都非常順利!感謝您的幫助。

回答

1

您可以試試這個,但如果您的表缺少索引,它可能沒有多大幫助。

BEGIN 
SELECT * 
FROM itemproperty i 
WHERE exists 
    (SELECT 1 
    FROM collectionitem c 
    WHERE collectionid = sId AND i.itemid = c.itemid AND removed ='0000-00-00 00:00:00'); 
END 
+0

我不確定要在數據庫中編制什麼索引 – Theveloper

+0

通常,您需要[索引字段](http://dev.mysql.com/doc/refman/5.0/en/create-index.html)在連接或過濾器中。爲了您的需要,我會索引collectionid,itemproperty.itemid,collectionitem.itemid,並將其刪除。 – kirbs

1

好給它的查詢,(你應該證明,僅通過在服務器上TEH propmpt運行它)

切查詢出來的SP和前綴它解釋查看查詢執行計劃confrm但有些事情直接脫穎而出。

SELECT * 
FROM itemproperty 
inner join collectionitem on collectionitem.itemid = itemproperty.itemid and removed ='0000-00-00 00:00:00' 

擺脫子查詢。

被刪除的日期時間,是否被索引?

+0

removed是一個時間戳,它沒有索引,如果一個項目被刪除一個日期出現而不是0000,所以查詢沒有拿起它。我應該索引什麼? – Theveloper

+0

同意@kirrbs,如果itemid是您的兩個表中的主鍵,那麼它們將被排序,任何嚴重的延遲都會對remove = whatever進行全面掃描。就像我說的那樣複製查詢瞭解如何解釋工作,在添加索引之前和之後執行,開始獲取它所說的內容。 –

相關問題