Производительность SQL IN Query - лучше разделить или нет - PullRequest
0 голосов
/ 02 октября 2018

Я получаю до 1000 идентификаторов с другого сервера, чтобы отобразить их для посетителей, поэтому мне нужно использовать запрос IN, например:

SELECT * FROM `table` WHERE `id` IN (23221, 42422, 2342342....) // and so on, up to 1000

Допустим, 1/3 посетителей будет смотреть, хотя все1000 идентификаторов, в то время как 2/3 из них будут смотреть только первые 50.

Что будет лучше для производительности / рабочей нагрузки, один запрос для всех 1000 идентификаторов или разделить их на 20 запросов, по 50 идентификаторов каждый?Поэтому, когда были просмотрены первые 50, запросите следующие 50 и т. Д.

РЕДАКТИРОВАТЬ:

Мне не нужно использовать LIMIT при разбиении, что означает, что идентификаторы в запросе будут50 макс.Так что же лучше, один запрос с 1000 идентификаторами одновременно или 20 запросов через каждые 50 идентификаторов?

РЕДАКТИРОВАТЬ:

Хорошо, я прошу это коротко и более прямо: 1000 идентификаторов в одном запросе не слишком много? Я прочитал здесь Как оптимизировать SQL-запрос со многими тысячами предложений WHERE что тонны WHERE / OR плохие ??

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Допустим, 1/3 посетителей будут смотреть все 1000 идентификаторов, в то время как 2/3 из них будут смотреть только первые 50.

Поскольку вы хотите оптимизироватьВаш ответ, поскольку вы предполагали, как посетители будут относиться к нему.

Что было бы лучше для производительности / рабочей нагрузки, один запрос для всех 1000 идентификаторов или разделить их на 20 запросов по 50 идентификаторов каждый?Поэтому, когда первые 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  

то, что сделает вышеупомянутый запрос: получит все данные опубликованных идентификаторов, затем упорядочит по идентификатору в порядке возрастания.Затем из их числа он выберет только первое 10/50/100, в следующий раз выберет следующее 10/50/100 или что бы вы ни выбрали и пропустите выбор.Надеюсь, это поможет мужчине:)

0 голосов
/ 02 октября 2018

Вы можете посмотреть ответ, приведенный здесь: MySQL Data - Лучший способ реализовать подкачку?

С помощью оператора LIMIT вы можете вернуть только часть результата.Изменяя параметры в операторе LIMIT, вы можете повторно использовать запрос.

Знайте, что если вы не используете 'ORDER BY', сервер SQL не всегда возвращает одинаковые записи.Другими словами, если запись недоступна для чтения из-за происходящего обновления, в то время как сервер базы данных может прочитать следующую запись, он извлечет следующую запись (чтобы дать результат как можно скорее).Я точно не знаю, заставляет ли LIMIT сервер базы данных принимать во внимание какой-то порядок (я не очень знаком с MySql).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...