亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

邏輯刪除的字段在查詢的時候的性能影響(Version3.1.0)

TbUser?one?=?new?LambdaQueryChainWrapper<>(tbUserMapper)
????????.select(TbUser::getUserId,?TbUser::getNickname)
????????.eq(TbUser::getUserId,?1239563848215904258L).one();

邏輯刪除的字段是deleted

但是我發現執行的時候打印的SQL是

SELECT?user_id,nickname?FROM?tb_user?WHERE?deleted=0?AND?user_id?=??

deleted條件自動放在了最前面,這樣對大數據量查詢性能不會有負面影響嗎?


正在回答

3 回答

? ? ? ?按照我看到過的文章,說sql是從右向左解析的,能夠排除最大量數據的條件應該放在最右面。你那句明顯應該是user_id?= ?這個條件過濾掉的數據最多。單單從這條語句來說,deleted=0放在最前面是對的。但是其他情況則不一定,我目前了解的mp,這個邏輯刪除字段的位置還不能修改,你可以去MP官方群里咨詢一下作者,看看能否解決。或者在github或gitee上提問。

0 回復 有任何疑惑可以回復我~

以本人愚見,MySQL對語句的執行是有優化的。MySQL會對執行的語句進行處理,生成多種執行方案,然后選取成本最低的方案。下面是兩條語句的執行計劃:

mysql> explain SELECT * FROM user WHERE ?id = 1088248166370832385 and deleted =0\G
*************************** 1. row ***************************
? ? ? ? ? id: 1
?select_type: SIMPLE
? ? ? ?table: user
? partitions: NULL
? ? ? ? type: const
possible_keys: PRIMARY
? ? ? ? ?key: PRIMARY
? ? ?key_len: 8
? ? ? ? ?ref: const
? ? ? ? rows: 1
? ? filtered: 100.00
? ? ? ?Extra: NULL


mysql> explain SELECT * FROM user WHERE deleted=0 AND id = 1088248166370832385\G
*************************** 1. row ***************************
? ? ? ? ? id: 1
?select_type: SIMPLE
? ? ? ?table: user
? partitions: NULL
? ? ? ? type: const
possible_keys: PRIMARY
? ? ? ? ?key: PRIMARY
? ? ?key_len: 8
? ? ? ? ?ref: const
? ? ? ? rows: 1
? ? filtered: 100.00
? ? ? ?Extra: NULL


兩個的執行計劃是一樣的。它們的效率應該會相等吧。

0 回復 有任何疑惑可以回復我~

你的需求是大數據量,那么肯定會分頁,這個時候先后順序其實影響不大。如果非要說性能的話,其實你多了一個deleted=0 條件性能肯定有損耗,因為你這條SQL語句如果沒有邏輯刪除這個功能的話直接走的是主鍵索引user_id(主鍵)當然性能最好。如果對性能問題很介意,你可以自定義SQL查詢,它不走邏輯刪除。其實,邏輯刪除的目的是為了數據安全,我們需要做出選擇,在安全和性能中找到平衡。希望可以幫到你。



0 回復 有任何疑惑可以回復我~
#1

成佛的小兔幾 提問者

SQL的執行是有順序的,如果將deleted條件放在最后,性能不就影響很小了嗎?
2020-03-17 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

邏輯刪除的字段在查詢的時候的性能影響(Version3.1.0)

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號