簡體   English   中英

檢查MySQL表是否為空:COUNT(*)為零而LIMIT(0,1)是否為結果?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM