2009-10-28 48 views
2

問題都捨不得虧的條目存在的快速檢查:在SQL數據庫

我想有一個函數返回一個布爾值來檢查,如果表中有一個條目與否。我需要調用這個,所以需要進行一些優化。現在

Iues MySQL,但是應該是相當的基本...

所以我應該使用

select id from table where a=b limit 1; 

select count(*) as cnt from table where a=b; 

什麼完全地不同?

我認爲帶有限制的SELECT應該在第一次查找後停止,count(*)需要檢查所有條目。所以SELECT可能會更快。

最簡單的事情會做幾個循環並測試它,但我的測試沒有幫助。 (我的測試系統似乎也被使用,否則也會使用稀釋的mny結果)

+0

無論在哪種情況下,您都希望確保有'a'索引。 – 2009-10-28 14:25:06

+0

@Brett:真的沒有足夠的信息說這個。如果'a'是具有3個可能值的枚舉常量,則其上的索引不會提高性能。 – Andomar 2009-10-28 19:01:14

回答

1

限制1將告訴MySQL在找到一行後停止搜索。如果可以有多個符合條件的行,則這比count(*)快。

有更多的方法來優化這個,但確切的性質取決於行數量和a和b的傳播。我會選擇「where a = b」的方法,直到你遇到性能問題。數據庫通常速度很快,大多數查詢根本沒有性能問題。

3

此「需要」通常表示您嘗試插入或更新的情況。最常見的兩種情況是批量加載/更新行或點擊計數。

使用INSERT ... ON DUPLICATE KEY UPDATE語句可以避免首先檢查是否存在行。對於一個熱門的櫃檯,只需要一個單一的陳述。對於批量加載,將數據加載到臨時表中,然後使用INSERT ... ON DUPLICATE KEY UPDATE使用臨時表作爲源。

但是如果你不能使用這個,那麼最快的方法將是select id from table where a=b limit 1;以及force index以確保mysql僅查找索引。

+0

+1使用一條語句具有事務性的優點。如果您在單獨的SELECT中檢查是否存在,則該行可能會在SELECT和INSERT之間添加。 – Andomar 2009-10-28 18:59:02

+0

對於普通SQL有很好的建議,但是我使用了一個不需要獨特的orm,所以我必須在自己的應用程序邏輯中執行此操作。似乎也沒有檢查存在。 所以這是一個很好的答案,即使它不是我所希望的。 – WegDamit 2009-10-29 08:39:57

+0

更新了我的答案。 – longneck 2009-10-29 13:17:04