Эффективность множественных тестов на равенство по сравнению с объединениями в MySQL

#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:

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