2015-03-11 2 views
0

У меня .6 миллионов набор данных. Теперь я пытаюсь сортировать набор данных по метке времени, а также из-за отношения «один-много» я ​​должен сделать некоторые внутренние JOIN и использовать разные.Заказ с отличным влияет на производительность

Мой запрос как ниже,

SELECT DISTINCT p.id, s.subject, p.joining_time 
     FROM profile p 
     INNER JOIN profile_subject ps ON p.id=ps.profile_id 
     LEFT JOIN subject s ON ps.subject_id=s.id 
     ORDER BY p.joining_time LIMIT 20; 

Сейчас этот запрос принимает почти 28 сек Но без приказа пункта его принимать только 0,11 сек

Как улучшить этот запрос с желаемым результатом?

+0

Да, это уже проиндексировано. –

+0

У вас есть сводный индекс или просто индекс на joining_time? –

+0

Двоичный указатель на joining_time. Но в чем здесь нуждается составной индекс? –

ответ

1

Мое самое простое предложение - поместить индекс на profile(joining_time). Затем выберите определенное количество последних в подзапросе. Например, если вы очень уверены в том, что верхние 20 строк, которые вы хотите в течение последних 100 записей в profile, то вы можете попробовать это:

SELECT DISTINCT p.id, s.subject, p.joining_time 
FROM (SELECT p.id, p.joining_join 
     FROM profile p 
     ORDER BY p.joining_time 
     LIMIT 100 
    ) p INNER JOIN 
    profile_subject ps 
    ON p.id = ps.profile_id LEFT JOIN 
    subject s 
    ON ps.subject_id = s.id 
ORDER BY p.joining_time 
LIMIT 20; 

Я хотел бы также предположить, что вы удалите DISTINCT ключевое слово. Если у вас нет дубликатов предметов для одного профиля, то это необязательно. Точно так же трудно поверить, что LEFT JOIN необходим. В хорошо структурированной базе данных не должно быть subject_id значений в profile_subject, которые не находятся в subject. Итак, попробуйте следующее:

SELECT p.id, s.subject, p.joining_time 
FROM (SELECT p.id, p.joining_join 
     FROM profile p 
     ORDER BY p.joining_time 
     LIMIT 100 
    ) p INNER JOIN 
    profile_subject ps 
    ON p.id = ps.profile_id JOIN 
    subject s 
    ON ps.subject_id = s.id 
ORDER BY p.joining_time 
LIMIT 20; 
+0

Да У меня есть повторяющиеся значения. Между отдельными и групповыми, что я должен использовать в случае дублирования значений? –

+1

@JohnMaclein. , , Они должны иметь очень схожие характеристики. Большинство движков баз данных используют один и тот же базовый алгоритм для обоих. –

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