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的分布在這個表中足夠分散)
select * from userPackage where packageId<>7
直接使用<>
第一種更快。
mysql查詢速度要遠快於遍曆的速度的。遍曆的時候迴圈次數越少越好。
肯定是第一種快啊,千萬別把所有的資料都取出來。。。mysql受不了