[英]Check if MySQL Table is empty: COUNT(*) is zero vs. LIMIT(0,1) has a result?
這是一個關於效率的簡單問題,與MySQL實現有關。 我想檢查一個表是否為空(如果它是空的,則使用默認數據填充它)。 是否最好使用SELECT COUNT(*) FROM `table`
,然后比較為0,或者更好的做一個語句,如SELECT `id` FROM `table` LIMIT 0,1
然后檢查是否有返回結果(結果集有下一個)?
雖然我需要這個用於我正在開發的項目,但我也對MySQL如何處理這兩個語句感興趣,以及人們似乎建議使用COUNT(*)
的原因是因為結果是緩存還是它實際上是通過每個排,並添加到計數,因為它在我看來是直觀的。
你絕對應該使用第二個查詢而不是第一個查詢。
當使用COUNT(*)
,MySQL正在掃描至少一個索引並計算記錄。 即使你將調用包裝在LEAST()
( SELECT LEAST(COUNT(*), 1) FROM table;
)或IF()
,MySQL也會在進一步評估之前完全評估COUNT()
。 我不相信MySQL在使用InnoDB時會緩存COUNT(*)
結果。
您的第二個查詢導致只讀取一行,此外還使用索引(假設id是一個的一部分)。 查看驅動程序的文檔,了解如何檢查是否已返回任何行。 順便說一句,可以從查詢中省略id
字段(MySQL將使用任意索引):
SELECT 1 FROM table LIMIT 1;
但是,我認為最簡單,最高效的解決方案如下(如Gordon的回答所示):
SELECT EXISTS (SELECT 1 FROM table);
如果子查詢返回任何行,則EXISTS
返回1
,否則返回0
。 由於這種語義,MySQL可以正確地優化執行。 子查詢中列出的任何字段都將被忽略,因此通常會寫入1
或*
。
有關EXISTS
關鍵字及其用法的更多信息,請參閱MySQL手冊 。
最好是做第二種方法或只是exists
。 具體來說,類似於:
if exists (select id from table)
應該是做你想做的最快的方式。 你不需要limit
; SQL引擎為您處理這個問題。
順便說一下,永遠不要將標識符(表名和列名)放在單引號中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.