Будет ли принудительная `group by` сортировка DESC ускорять код или замедлять его? - PullRequest
1 голос
/ 30 августа 2011

В MySQL group by делает неявное order by ASC.
Это замечательно, если вы хотите добавить ORDER BY ASC, потому что тогда результаты уже упорядочены.

Но если вы хотите ORDER BY .. DESC MySQL должен упорядочить набор результатов в обратном порядке.

Ускорит ли этот трюк выбор, замедлит его или вообще ничего не сделает

SELECT field1, field2 FROM atable 
GROUP BY -mydate   -- group by trick to force a `group by ... desc`
ORDER BY mydate DESC

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

Ответы [ 3 ]

2 голосов
/ 31 августа 2011

Из моих тестов добавление любого модификатора сортировки в группу, например -, для изменения порядка сортировки замедляет процесс.

Однако вы можете указать:

SELECT id, name, sum(amount) FROM customers GROUP BY id DESC

И MySQL с радостью упорядочит результаты в порядке DESC, не нуждаясь в дополнительном предложении order by.Это не повлечет за собой дополнительную среду выполнения, которую добавляет -.

1 голос
/ 07 сентября 2011

Я думаю, что вы ошибаетесь: GROUP BY не сортирует данные.Это поведение по умолчанию для MySQL, так как MySQL добавляет те же ORDER BY, что и GROUP BY, который вы установили, как вы упомянули в первом предложении.

Итак, если вы отключите сортировку,при использовании ORDER BY NULL сортировка вообще отсутствует.GROUP BY будет только группировать строки, используя индексы, если это возможно.Следовательно, «трюк» неправильный, так как вы удалите возможность использовать индекс для mydate.GROUP BY отлично работает, пока индекс подходит для него.

Итак:

SELECT field1, field2 FROM atable 
GROUP BY mydate
ORDER BY NULL

должен быть действительно быстрым, если у вас есть индекс (mydate), и

SELECT field1, field2 FROM atable 
GROUP BY mydate
ORDER BY mydate DESC

должен быть таким же быстрым (в зависимости от структуры таблицы MyISAM немного медленнее в обратном порядке).

Если у вас есть предложение WHERE, убедитесь, что вы добавилистолбцы в индексе, например:

SELECT field1, field2 FROM atable 
WHERE fied1 = 5
GROUP BY mydate
ORDER BY mydate DESC

потребуется индекс для (field1, mydate).

0 голосов
/ 30 августа 2011

Slow It Down

Здесь происходит то, что вы просите MySQL отсортировать записи на основе (возможно) неиндексированного столбца mydate.

Любая сортировка требует времени, но сортировки по проиндексированным столбцам происходят быстрее, чем по неиндексированным.

Вот некоторые дополнительные чтения: http://www.mysqlperformanceblog.com/2006/09/01/order-by-limit-performance-optimization/

...