Что лучший способ состоит в том, чтобы выбрать несколько строк идентификатором в sql?

Я должен выбрать несколько записей

Я использую

SELECT *
FROM `table`
WHERE `ID` =5623
   OR `ID` =5625
   OR `ID` =5628
   OR `ID` =5621

этот запрос работает 4 раза в секунду с php

существует ли лучший и более быстрый путь к этому?

23
задан EliadL 18 August 2019 в 15:19
поделиться

5 ответов

SELECT *
FROM `table`
where ID in (5263, 5625, 5628, 5621) 

, вероятно, лучше, но не быстрее.

57
ответ дан 29 November 2019 в 00:56
поделиться

Если вы сделаете

SELECT *
FROM `table`
WHERE `ID` IN (5623, 5625, 5628, 5621)

, все будет в порядке, если количество идентификаторов не станет слишком большим. Я предлагаю вам создать индекс для идентификаторов, чтобы запрос выполнялся быстрее.

Также подумайте об изменении своей логики, чтобы не передавать такое количество идентификаторов

1
ответ дан 29 November 2019 в 00:56
поделиться
SELECT *
FROM `table`
WHERE `ID` IN (5623, 5625, 5628, 5621)

Но четыре раза в секунду - это много. Я бы подумал о другом подходе, который требует меньшего доступа к базе данных.

2
ответ дан 29 November 2019 в 00:56
поделиться

В дополнение к тому, что указали люди (где id in):

1) Если идентификаторов много, лучше поместить их во временную таблицу и выполнить соединение с этой временной таблицей

2) Убедитесь, что ваша таблица имеет индекс на id

3) Если своевременность данных не критична, поместите результаты запроса в кэш на стороне приложения

.
7
ответ дан 29 November 2019 в 00:56
поделиться
SELECT *
FROM `table`
WHERE `ID` in (5623, 5625, 5628, 5621)

Исследуя эту тему дальше, я наткнулся на интересный блог пост , который объясняет, как использовать набор для получения более высокой производительности SQL от In clauses, создавая список идентификаторов в Common Table Expression (CTE), а затем соединяя их.

Таким образом, для достижения максимальной производительности вы можете написать в PHP эквивалент следующего кода.

DECLARE  @idList varchar(256) 
SET @idList = '5623, 5625, 5628, 5621'

;with ids (id) as
(
    SELECT value FROM UTILfn_Split(@idList,',')
)

SELECT     t.* 
FROM     table as t
INNER JOIN    ids
ON        t.ID = ids.id
4
ответ дан 29 November 2019 в 00:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: