MySQL db использует «Использование где; Использование временного; Использование сортировки файлов» при сортировке по дате - PullRequest
1 голос
/ 22 июля 2011

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

SELECT goal.title, max(updates.date_updated) as update_sort 
FROM `goal` 
LEFT OUTER JOIN `update` `updates` ON (`updates`.`goal_id`=`goal`.`goal_id`) 
WHERE (goal.private=0) 
GROUP BY updates.goal_id 
ORDER BY update_sort desc 
LIMIT 12

Когда я делаю объяснение, он говорит, что он не использует никаких ключей, и что он ищет каждую строку. Также говорит мне, что он использует «Using where; Using временный; Using filesort».

Любая помощь очень ценится

Спасибо


Его нужно сгруппировать по goal_id, поскольку MAX () при выборе возвращает только одну строку.

То, что я пытаюсь сделать, это вернуть строку MAX date_updated из таблицы updates для каждой цели и затем отсортировать ее по этому столбцу.


Текущие индексы находятся на goal.private и update.goal_id


вывод EXPLAIN (не удается загрузить изображения, поэтому нужно поместить его здесь, извините, если не ясно:

id  select_type     table   type    possible_keys   key         key_len     ref           rows  Extra
1   SIMPLE          goal    ref     private         private     1           const         27    Using temporary; Using filesort
1   SIMPLE          updates ref     goal_id         goal_id     4           goal.goal_id  1     

Ответы [ 2 ]

1 голос
/ 25 июля 2011
SELECT  u.date_updated, g.title
FROM    updates u
JOIN    goal g
ON      g.goal_id = u.goal_id
WHERE   u.id = 
        (
        SELECT  ui.id
        FROM    updates ui
        WHERE   ui.goal_id = u.goal_id
        ORDER BY
                ui.goal_id, ui.date_updated, ui.id
        LIMIT 1
        )
        AND g.private = 0
ORDER BY
        u.date_update, u.id
LIMIT 12

Создайте два индекса на updates для быстрого выполнения запроса:

updates (goal_id, date_updated, id)
updates (date_updated, id)
0 голосов
/ 22 июля 2011

Я предполагаю, что функция MAX () вызывает такое поведение.Нужно посмотреть на каждую запись, чтобы решить, какие строки выбрать.Какую группировку вы пытаетесь достичь?

...