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

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

SELECT article FROM table1 ORDER BY publish_date LIMIT 20

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

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

Ответ 1

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

Ответ 2

Предложение 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

Ответ 3

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

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

Ответ 4

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

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

ORDER BY stamp DESC

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

Ответ 5

Так же, как @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 номеров записей

Ответ 7

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

Ответ 8

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

mysql - LIMIT 1, 2

postgres - LIMIT 2 OFFSET 1