MYSQL - ПОРЯДОК И ОГРАНИЧЕНИЯ

У меня есть запрос, который выглядит так:

SELECT article FROM table1 ORDER BY publish_date LIMIT 20

Как работает ORDER BY? Будет ли он заказывать все записи, а затем получить первые 20, или он получит 20 записей и упорядочит их по полю publish_date?

Если это последний, вам не гарантировано получить последние 20 статей.

+210
источник поделиться
8 ответов

Сначала он закажет, а затем получит первую 20. База данных также будет обрабатывать что-либо в предложении WHERE до ORDER BY.

+216
источник

Предложение LIMIT может использоваться для ограничения количества строк, возвращаемых оператором SELECT. LIMIT принимает один или два числовых аргумента, которые должны быть неотрицательными целочисленными константами (кроме случаев, когда используются подготовленные операторы).

С двумя аргументами первый аргумент указывает смещение первой строки для возврата, а второй указывает максимальное количество возвращаемых строк. Смещение начальной строки равно 0 (не 1):

SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15

Чтобы получить все строки с определенного смещения до конца результирующего набора, вы можете использовать некоторое большое число для второго параметра. Этот оператор извлекает все строки из 96-й строки до последней:

SELECT * FROM tbl LIMIT 95,18446744073709551615;

С помощью одного аргумента значение указывает количество строк, возвращаемых с начала набора результатов:

SELECT * FROM tbl LIMIT 5; # Retrieve first 5 rows

Другими словами, LIMIT row_count эквивалентен LIMIT 0, row_count.

Подробная информация о: http://dev.mysql.com/doc/refman/5.0/en/select.html

+35
источник
другие ответы

Связанные вопросы


Похожие вопросы

Если есть подходящий индекс, в этом случае в поле publish_date, MySQL не должен сканировать весь индекс, чтобы получить 20 запрошенных записей - 20 записей будут найдены в начале индекса. Но если нет подходящего индекса, то потребуется полное сканирование таблицы.

В 2009 году есть статья в блоге по производительности MySQL.

+7
источник

Вы можете добавить [asc] или [desc] в конце заказа, чтобы получить самые ранние или последние записи

Например, это даст вам самые последние записи

ORDER BY stamp DESC

Добавить предложение LIMIT после ORDER BY

+7
источник

Так же, как @James говорит, он будет заказывать все записи, а затем получить первые 20 строк.

Таким образом, вы получите 20 первых опубликованных статей, но новые не будут показаны.

В вашей ситуации я рекомендую вам добавить desc в order by publish_date, если вам нужны новейшие статьи, тогда самая новая статья будет первой.

Если вам нужно сохранить результат в порядке возрастания и все еще хотите только 10 новых статей, вы можете попросить mysql отсортировать результат два раза.

Этот запрос будет сортировать результат по убыванию и ограничить результат до 10 (это запрос в круглой скобке). Он по-прежнему будет отсортирован в порядке убывания, и нас это не устраивает, поэтому мы просим mysql сортировать его еще раз. Теперь у нас есть последний результат в последней строке.

select t.article 
from 
    (select article, publish_date 
     from table1
     order by publish_date desc limit 10) t 

order by t.publish_date asc;

Если вам нужны все столбцы, это делается следующим образом:

select t.* 
from 
    (select * 
     from table1  
     order by publish_date desc limit 10) t 

order by t.publish_date asc;

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

+6
источник

Вы можете использовать этот код SELECT article FROM table1 ORDER BY publish_date LIMIT 0,10 где 0 - начальный предел записи и 10 номеров записей

+4
источник

LIMIT обычно применяется как последняя операция, поэтому результат сначала будет отсортирован, а затем ограничен до 20. Фактически сортировка прекратится, как только будут найдены первые 20 отсортированных результатов.

+2
источник

Также синтаксис LIMIT отличается от баз данных, например:

mysql - LIMIT 1, 2

postgres - LIMIT 2 OFFSET 1

-2
источник

Посмотрите другие вопросы по меткам или Задайте вопрос