2013-03-27 5 views
0

У меня есть таблица пользователей с информацией о пользователе и связанной таблицей, которая покажет связанным пользователям с текущим пользователем.Оптимизация связанного запроса таблицы

Чтобы получить соответствующие пользователям идентификатор пользователя «25» мой запрос выглядит

SELECT 
    id 
FROM users u 
    INNER JOIN (SELECT 
       primary_id, 
       secondary_id 
       FROM users_rel 
       WHERE primary_id = '25' 
        OR secondary_id = '25') temp 
    ON (u.id = temp.primary_id 
     OR u.id = temp.secondary_id) 
WHERE u.id != '25' 

вопрос здесь является то, что в users_rel таблице идентификатор пользователя может быть либо на первичной стороне или на вторичной стороне , Не говорите мне об этом, потому что это уже сделано для 6 миллионов записей, поэтому я не могу его изменить. этот запрос занимает от 2 до 5 минут для выполнения с 4000 записей в таблице user_rel и 629241 в таблице users.

user_rel TABLE 
.--------------------------------. 
| id   | (VARCHAR,36) | 
| primary_id | (VARCHAR,36) | 
| secondary_id | (VARCHAR,36) | 
| del  | (TINYINT,1) | 
|.______________________________.| 

и индекс определяется как сочетание primary_id и secondary_id

+0

Можете ли вы опубликовать, как была разработана схема 'users_rel'? два столбца, объявленные как внешний ключ, или они имеют какой-либо индекс? –

+0

Вы можете использовать '25 IN (\' primary_id \ ', \ secondary_id \') ' – hjpotter92

ответ

1

его уже сделали за 6 миллионов записей, так что я не могу изменить его

Grow пару хардкор - что вы» ve уже получил относительно небольшой количество данных в таблицах не является веской причиной для устранения плохой конструкции.

Это поможет, если вы разместите точную структуру (то есть инструкцию create table) для обеих таблиц и плана объяснения.

Почему вы используете вспомогательный запрос вместо простого соединения таблицы? Снова снова вы можете начать оптимизацию:

SELECT u.id 
FROM users u 
INNER JOIN users_rel r 
    ON 25 in (primary_id, secondary_id) 
    AND (u.id = r.primary_id 
     OR u.id=r.secondary_id) 
WHERE u.id != '25'; 

Это должно дать тот же результат. Быстрее ли ... мы не знаем.

индекс определяется как сочетание primary_id и secondary_id

Почему? Это не поможет многого с этим запросом - вам нужно 2 индекса один на primary_id один на secondary_id.

Смежные вопросы