#mysql #join #performance
#mysql #Присоединиться #Производительность
Вопрос:
Допустим, я хотел запросить данные из таблицы содержимого на основе идентификатора пользователя, связанного с этим содержимым, но я хотел получать содержимое более чем от одного пользователя.
SELECT field1, field2, ... fieldn
FROM content
WHERE user_id=1 OR user_id=2 OR ...
Мне кажется, что это относительно эффективно… до определенного момента. Допустим, в content
таблице было >200 тыс. записей, и меня интересовали записи от 50 конкретных пользователей. Будет ли запрос, подобный следующему, по-прежнему эффективным?
SELECT field1, field2, ... fieldn
FROM content
WHERE user_id=1 OR ... OR user_id=50
Я рассматриваю возможность создания таблицы users_group, подобной этой:
CREATE TABLE users_group (
group_id int(11),
user_id int(11),
primary_key(group_id,user_id)
);
… и заполнение его группами пользователей, в которых заинтересовано программное обеспечение.
Затем я мог бы выполнить запрос, подобный этому:
SELECT field1, field2, ... fieldn
FROM content c
INNER JOIN users_group ug ON c.user_id=ug.user_id
WHERE ug.group_id=1
Было бы это более эффективно?
Ответ №1:
Или что-то еще проще:
SELECT field1, field2, ... fieldn
FROM content
WHERE user_id IN (1,2,3,4,5,6,7...50)
Построить как динамический SQL из чего-то вроде PHP таким образом проще простого.
- добавлено: также довольно прилично, пока вы не дойдете до> 1000 или около того элементов. Вам также придется следить за MAX_PACKET , но это самый простой / быстрый способ сделать это для вещей в этом диапазоне.
Комментарии:
1. это всего лишь синтаксическое изменение, оптимизатор будет рассматривать это так же, как серию операторов OR
2. Согласен. Это плохой ответ на его вопрос. Я думаю, что правильный ответ «Это более эффективно». База данных должна каким-то образом получать эту информацию, и предоставление будет быстрее. В конце концов, ни один из них не окажет существенного влияния на 200 Тыс. записей, при условии, что индексы работают должным образом.
Ответ №2:
Я думаю, трудно сказать, будет ли это быстрее или нет, в конечном итоге базе данных все равно придется выполнять ту же работу, но, возможно, она сможет сделать это более эффективно с помощью алгоритма объединения, чем с помощью поиска по индексу, вам придется сравнить его.