Ответ 1
Сначала он закажет, а затем получит первую 20. База данных также будет обрабатывать что-либо в предложении WHERE
до ORDER BY
.
У меня есть запрос, который выглядит так:
SELECT article FROM table1 ORDER BY publish_date LIMIT 20
Как работает ORDER BY? Будет ли он заказывать все записи, а затем получить первые 20, или он получит 20 записей и упорядочит их по полю publish_date
?
Если это последний, вам не гарантировано получить последние 20 статей.
Сначала он закажет, а затем получит первую 20. База данных также будет обрабатывать что-либо в предложении WHERE
до ORDER BY
.
Предложение 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
Если есть подходящий индекс, в этом случае в поле publish_date
, MySQL не должен сканировать весь индекс, чтобы получить 20 запрошенных записей - 20 записей будут найдены в начале индекса. Но если нет подходящего индекса, то потребуется полное сканирование таблицы.
В 2009 году есть статья в блоге по производительности MySQL.
Вы можете добавить [asc] или [desc] в конце заказа, чтобы получить самые ранние или последние записи
Например, это даст вам самые последние записи
ORDER BY stamp DESC
Добавить предложение LIMIT
после ORDER BY
Так же, как @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;
Я использую эту технику, когда я вручную записываю запросы для изучения базы данных для разных вещей. Я не использовал его в производственной среде, но теперь, когда я столкнулся с ним, дополнительная сортировка не влияет на производительность.
Вы можете использовать этот код
SELECT article FROM table1 ORDER BY publish_date LIMIT 0,10
где 0 - начальный предел записи и 10 номеров записей
LIMIT обычно применяется как последняя операция, поэтому результат сначала будет отсортирован, а затем ограничен до 20. Фактически сортировка прекратится, как только будут найдены первые 20 отсортированных результатов.
Также синтаксис LIMIT отличается от баз данных, например:
mysql
- LIMIT 1, 2
postgres
- LIMIT 2 OFFSET 1