Более быстрые альтернативы для операторов «IN»?

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

У меня следующая структура таблицы:

TABLE Files
files_id => INT(12), PRIMARY, AUTO INCREMENT, NOT NULL
files_name => VARCHAR(255), NOT NULL
(some other fields such as file type etc)

TABLE File_Permissions
perm_id => INT(12), PRIMARY, AUTO INCREMENT, NOT NULL
perm_files_id => INT(12), NOT NULL
perm_users_id => INT(12), NOT NULL

Я извлекаю список файлов, которые пользователь может просматривать с помощью следующего SQL:

SELECT files_name FROM Files WHERE files_id IN 
    (SELECT perm_files_id FROM File_Permissions WHERE perm_users_id = 'xxxxxx');

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

Это занимает почти 2 секунды на запрос. Я уверен, что здесь что-то не так, я просто не не знаю, что это такое.

Большое спасибо за помощь!

5
задан Mahdi.Montgomery 8 March 2011 в 21:01
поделиться