[英]SQL IN Query performance - better split it or not
我從另一台服務器獲取了多達1000個ID,以將其顯示給訪問者,因此我必須使用IN查詢,例如:
SELECT * FROM `table` WHERE `id` IN (23221, 42422, 2342342....) // and so on, up to 1000
假設有1/3的訪客會觀看,雖然所有1000個id都在觀看,而其中有2/3的訪客只會觀看前50個。
對於性能/工作負載,哪個查詢可以查詢所有1000個ID,或者將其拆分為20個查詢,每個查詢可以分配50個ID,那會更好呢? 因此,當觀看了前50個時,請查詢下50個,以此類推。
編輯:
拆分時,我不需要使用LIMIT,這意味着查詢中的ID最多為50。 那么更好的是,一次查詢一次具有1000個ID的查詢,還是20次查詢每個50個ID的查詢?
編輯:
好吧,我很快又直接問了一下: 一個查詢中的1000個ID是否不是太多? 我在這里閱讀了如何使用成千上萬個 WHERE / OR不好的數千個WHERE子句來優化SQL查詢 ?
假設有1/3的訪客會觀看,雖然所有1000個id都在觀看,而其中有2/3的訪客只會觀看前50個。
由於您要優化訪問者的響應,因此假設訪問者將如何對待它。
對於性能/工作負載,哪個查詢可以查詢所有1000個ID,或者將其拆分為20個查詢,每個查詢可以分配50個ID,那會更好呢? 因此,當觀看了前50個時,請查詢下50個,以此類推。
是的,您是正確的,應該限制返回響應。 這是如何實現您的要求的一個示例(我對mysql不太了解,但是這是您可以獲得期望結果的方式)。
SELECT * FROM `table` WHERE `id` IN (23221, 42422, 2342342....)
order by `id`
LIMIT 10 OFFSET 10
如果是SQL SERVER
:
create stored proc sp_SomeName
@id varchar(8000)
@skip int,
@take int
as
begin
SELECT * FROM some_table WHERE id IN (23221, 42422, 2342342....)
order by id
OFFSET @skip ROWS --if 0 then start selecting from 0
FETCH NEXT @take ROWS ONLY --if 10 then this is the max returning limit
end
上面的查詢將執行以下操作:將獲取發布的ID的所有數據,然后按ID升序排列。 然后從他們的選擇中,僅選擇第一個10/50/100,下一次,它將選擇下一個10/50/100或您采用的選擇,然后跳過選擇。 希望這對男人有幫助:)
您可以查看此處提供的答案: MySQL數據-實現分頁的最佳方法?
使用LIMIT語句,您只能返回結果的一部分。 通過更改LIMIT語句中的參數,您可以重新使用查詢。
要知道,除非您使用“ ORDER BY”,否則SQL Server並不總是返回相同的記錄。 換句話說,如果由於發生了更新而無法讀取某條記錄,而數據庫服務器可以讀取下一條記錄,則它將獲取下一條記錄(盡快給出結果)。 我不確定LIMIT是否會強制數據庫服務器考慮某種順序(我對MySql不太熟悉)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.