Оптимизация запроса вместо использования порядка - PullRequest
1 голос
/ 05 января 2011

Я хочу выполнить простой запрос, чтобы получить «n» самых старых записей в таблице.(В нем есть столбец creation_date).

Как я могу получить это, не используя "order-by".Это очень большая таблица, и использование порядка по всей таблице для получения только "n" записей не столь убедительно.

(Предположим, n << размер таблицы) </p>

Ответы [ 4 ]

3 голосов
/ 05 января 2011

Когда вы беспокоитесь о производительности, вам, вероятно, не следует отказываться от использования заказа слишком рано.

Подобные запросы могут быть реализованы как запросы Top-N, поддерживаемые соответствующим индексом, который выполняется очень быстро, потому что не нужно сортировать всю таблицу, даже строки выборки, поскольку данные уже отсортированы индекс.

пример:

select *
  from table
 where A = ?
 order by creation_date 
 limit 10;

без соответствующего индекса будет медленно, если у вас много данных. Однако, если вы создадите такой индекс:

create index test on table (A, creation_date );

Запрос сможет начинать выборку строк в правильном порядке без сортировки и останавливаться при достижении предела.

Рецепт : поместите столбцы where в индекс, а затем порядок по столбцам.

Если предложение where отсутствует, просто поместите порядок в индекс. Порядок по должен соответствовать определению индекса, особенно если есть смешанные asc / desc ордера.

Индексированный запрос Top-N является определяющим фактором производительности - обязательно используйте их.

Мне мало ссылок для дальнейшего чтения (все мои):

Как эффективно использовать индекс в запросе mysql

http://blog.fatalmind.com/2010/07/30/analytic-top-n-queries/ (Oracle centric)

http://Use -The-Index-Luke.com / (пока не охватывает запросы Top-N, но это будет в 2011 году).

2 голосов
/ 05 января 2011

Я раньше не проверял эту концепцию, но попытался создать индекс для столбца creation_date. Который будет автоматически сортировать строки в порядке возрастания. Затем ваш запрос на выборку может использовать orderby creation_date desc с лимитом 20, чтобы получить первые 20 записей. Механизм базы данных должен понимать, что индекс уже выполнил работу по сортировке, и фактически не нужно сортировать, потому что индекс уже отсортировал его при сохранении. Все, что нужно сделать, это прочитать последние 20 записей из индекса.

Стоит попробовать.

1 голос
/ 05 января 2011

Создайте индекс для creation_date и выполните запрос, используя order by creation_date asc|desc limit n, и ответ будет очень быстрым (на самом деле он не может быть быстрее). Для «последнего n» сценария вам нужно использовать desc.

Если вам нужно больше ограничений для этого запроса (например, where state='LIVE'), тогда запрос может стать очень медленным, и вам придется пересмотреть стратегию индексирования.

0 голосов
/ 05 января 2011

Вы можете использовать Group By, если вы группируете некоторые данные, а затем Having для выбора определенных записей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...