使用exists查詢記錄是否存在

2021-08-28 20:17:48 字數 672 閱讀 2350

在使用rocketmq訊息中心時,為了保證冪等我專門建了個訊息消費記錄表,每個訊息消費後都往訊息消費記錄中插一條資料,在訊息到達時通過判斷是否在訊息消費記錄中存在這個訊息來保證冪等。

但是因為我把很多事件都放到佇列中,所以訊息的數量是十分之多的,一天能產生幾十萬條訊息,而查詢訊息消費記錄的**執行頻率十分之高,這時候我發現使用select count(*) 的效率急劇下降。我趕緊建了個定時器定時刪除過早的訊息。這時我想起了主管說過hibernate的exists會在找到第一條訊息時就直接返回true,而count則要將表中所有資料遍歷後才返回。

於是我起了興趣嘗試使用exists來優化查詢

select exists(select id from message_consumer_history where keycode = ?1 and type = ?2 and listentype=?3 limit 1)
好吧,其實效果和直接select id from message_consumer_history where keycode = ?1 and type = ?2 and listentype=?3 limit 1

是一樣的,關鍵是limit限制後語句只要找到結果就會返回。值得注意的是limit在count中是無效的。

不過不管怎樣還是提高了些微的效率,而且未來應該還是有適用的場景吧

MySQL使用exists優化in查詢

mysql 優化時,總是說在某些情況下要用 exists 代替 in,下面我會介紹一下,exists 替換 in 時需要注意的問題。1 建立表結構 使用者資訊表 create table user info id char 36 not null,name varchar 20 not null,a...

比較使用 EXISTS 和 IN 的查詢

sql codein和existsin 是把外表和內錶作hash 連線,而exists是對外表作loop迴圈,每次loop迴圈再對內表進行查詢。一直以來認為exists比in效率高的說法是不準確的。如果查詢的兩個表大小相當,那麼用in和exists差別不大。全文 in和existsin 是把外表和內...

比較使用 EXISTS 和 IN 的查詢

例如 表a 小表 表b 大表 1 select from a where cc in select cc from b 效率低,用到了a表上cc列的索引 select from a where exists select cc from b where cc a.cc 效率高,用到了b表上cc列的索...