Best-Practices
在應該只返回一行的查詢上使用“LIMIT 1”是一種不好的形式嗎?
如果您有這樣的查詢:
SELECT * FROM table WHERE primary_key_column = 123 LIMIT 1;
你怎麼看
LIMIT 1
?從技術上講,這不是必需的,因為我們在一個獨特的列上進行選擇。但我一直有將 放在LIMIT 1
末尾的習慣,因為它明確顯示了您的期望。我認為主要的負面因素可能是它可能會掩蓋查詢中的錯誤邏輯,使其返回不止一行,並使直接錯誤更難解決。
那麼
UPDATE
orDELETE
呢?這種“腰帶和大括號”的方法:UPDATE table SET a = 'ABC' WHERE primary_key_column = 123 LIMIT 1;
我們都知道在
LIMIT 1
終端中輸入查詢以防止更新我們不打算更新的行時,這是很有意義的。但是你仍然提倡在應用程序中對硬編碼和測試查詢使用它嗎?問題本質上是一般性的,沒有考慮到特定的 DBMS。
對於
SELECT
,我認為主要考慮因素之一與性能有關。當使用
LIMIT 1
關於行相關性的統計資訊時,可能會在確定更慢/更快的查詢執行方面發揮作用。雖然這對於小型數據集可能無法立即觀察到,但隨著行數和索引大小的增長(取決於 DB),它可能會成為一個問題。以這個例子為例,由於數據庫對執行成本的不同假設(基於
pg_statistic
目錄中可用的統計數據,特別是correlation
值),Postgres 使用者遇到了不同的執行時間,因此導致了不同的索引掃描策略。根據經驗,我
LIMIT
只會在必要時使用該子句,而不是將我的期望外化。
UPDATE
正如已經提到的,DELETE
行為高度依賴於數據庫。