簡體   English   中英

SQL IN查詢性能-更好地拆分或不拆分

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM