mysql查詢,濾除某一字段packageId(不是主鍵) = num的結果,是直接使用not in 好還是查詢完畢遍歷結果集的時候濾除好。查詢完後無論怎樣都需要遍歷結果集。
mysql查詢,濾除某一字段packageId(不是主鍵) = num的結果,是直接使用not in 好還是查詢完畢遍歷結果集的時候濾除好。查詢完後無論怎樣都需要遍歷結果集。
題主在評論中補充了問題
就是考慮到索引,所以才會考慮這類查詢條件會不走索引,全表查詢速率會很慢。不過這個任務的資料量還是很大的。這是給網站的一些套餐用戶發送簡訊的提醒的功能。不等於7是因為這個套餐是免費送的,不在考慮的範圍內。所以又必須去除。
對於這種大數據量的全表遍歷, 首先這種全表取的方式就是不可取的, 你可以考慮通過主鍵id分段的形式來進行查詢, 比如說, 你第一次查詢id > 0的200筆記錄, 然後記錄下最大id, 然後再查詢> 目前最大id的200筆記錄, 以此類推
在配合這種id分段的場景下, 你可以放心的把你的packageId放入查詢條件, 因為肯定是走到主鍵id上去的, 所以mysql過濾的數據最多也就200條, 所以問題不大(200只是舉例, 你可以自己根據實際情況和服務壓力進行控制)
額外還帶來一個好處是你也可以即時觀察當前任務的進行情況(發送了200個用戶了你可以打個日誌, 如果中斷你也可以知道從哪裡開始)
==== 以下是原答案 ===
你這個查詢是沒有分頁的, 這裡也就假定你的數據量其實非常小. 然後因為沒有分頁也必然會有全表掃描, 直接在sql查詢時做掉好了, 沒啥太大差別
另外, 只是單純的不等於一個值, 用!=
更直觀
如果你的查詢是數據量有一點規模的, 或者其實是有分頁的(只是你這裡的演示代碼還沒寫出來), 那麼你應該要考慮是否有其它的帶索引的查詢條件來輔助你查詢到你的資料, 如果沒有, 那你需要考慮對於這個packageId也要考慮一下是否要加索引(如果packageId的分佈在這個表中足夠分散)
<code class="sql">select * from userPackage where packageId<>7</code>
直接使用
第一種比較快。
mysql查詢速度要遠快於遍歷的速度的。遍歷的時候循環次數越少越好。
肯定是第一種快啊,千萬別把所有的資料都取出來。 。 。 mysql受不了