由于使用 Hibernate,我無法使用這樣的存在撰寫 JPA 查詢(我將其轉換為純 SQL 查詢):
SELECT EXISTS (SELECT * FROM account WHERE activated = true)
所以我必須撰寫一個替代查詢來檢查激活帳戶的存在。在閱讀了這個網站上的幾個建議后,我看到了一個替代品:
select case when count(*)> 0 then true else false end from account where activated = true
我的問題是:這對性能是否不利,是否是短路查詢。意思是如果查詢找到至少一個激活的帳戶,是否停止執行?或者它必須獲得所有激活的帳戶,然后在最后檢查總結果是否大于零?
uj5u.com熱心網友回復:
您的查詢似乎達到了,為什么不只是一個簡單的
select count(*)
from account
where activated = true
完成后,您將通過計數回傳一個記錄。但是,如果您只是想查看是否有任何帳戶被激活,那么您只需要
select 1
from account
where activated = true
limit 1
在這里,您強制限制為 1,因此只要找到第一個符合條件的查詢,查詢就完成了,您可以繼續——即使您的資料庫有 1000 條(甚至數百萬條)記錄。
uj5u.com熱心網友回復:
(這些注釋特定于帶有 InnoDB 的 MySQL。)
EXISTS()運行直到找到匹配的第一行。 COUNT()必須找到所有匹配項。因此,EXISTS至少與 一樣快COUNT,甚至可能快得多。
EXISTS退貨true或false
a > b退貨true或false
COUNT(*)退貨0或超過0;見下
a = true與效果相同a
我的觀點是:你不需要做任何類似的事情 ...then true else false...
您可能會看到false的0,對于非零true。也就是說,> 0也是不必要的(在您的示例中)。
對于您的具體問題,優化器不夠聰明,無法將 aCOUNT(*)>0轉換為EXISTS.
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/388652.html
