Проблема производительности MySQL - много и много ORing - PullRequest
1 голос
/ 29 ноября 2009

В API Facebook есть вызов $ facebook-> api_client-> friends_getAppUsers (); и это возвращает идентификаторы друзей пользователя, который использует приложение.

Теперь скажите, что я хочу выбрать из моей таблицы БД все строки, которые соответствуют всем идентификаторам друзей.

Единственный способ, которым я могу думать об этом, будет

ВЫБРАТЬ * ИЗ my_table ГДЕ UID IN (друг1, друг2, друг3, друг4 ... друг100);

Но не будет ли это ВЫБОР из-за непомерно высокой производительности? Есть ли другой способ добиться того же? Это должно быть довольно распространенным явлением в приложениях Facebook.

Если вы посмотрите на приложение Причины, оно позволит вам увидеть Причины ваших друзей. Я предполагаю, что приложение должно было бы выбрать все строки из таблицы причин, которые соответствуют всем идентификаторам пользователей.

Я поступаю неправильно?

1 Ответ

2 голосов
/ 29 ноября 2009

Если у вас нет индекса на uid, анализатор запросов выполнит сканирование таблицы на my_table и проверит каждую строку по списку друзей (представьте, что это просто каскад операторов if, выполняющихся в каждой строке) , Так что это примерно так же дорого, как:

SELECT * FROM my_table;

Теперь, если вы создадите индекс для uid, анализатор запросов все еще может выполнить сканирование таблицы, если набор друзей, с которыми проверяется, относительно велик. Если в списке относительно мало друзей, он может выполнять индивидуальный поиск по uid. Проведите несколько экспериментов с реалистичными наборами данных и посмотрите, что произойдет. Вы можете запросить у MySQL любой план запроса, добавив к запросу префикс EXPLAIN.

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