Order by php
Order by php
В некоторых случаях MySQL может использовать индекс, чтобы выполнить запрос ORDER BY или GROUP BY без выполнения дополнительной сортировки.
Индекс может также использоваться и тогда, когда предложение ORDER BY не соответствует индексу в точности, если все неиспользуемые части индекса и все столбцы, не указанные в ORDER BY — константы в выражении WHERE . Следующие запросы будут использовать индекс, чтобы выполнить ORDER BY / GROUP BY .
Ниже приведены некоторые случаи, когда MySQL не может использовать индексы, чтобы выполнить ORDER BY (обратите внимание, что MySQL тем не менее будет использовать индексы, чтобы найти строки, соответствующие выражению WHERE ):
- Сортировка ORDER BY делается по нескольким ключам: SELECT * FROM t1 ORDER BY key1,key2
- Сортировка ORDER BY делается, при использовании непоследовательных частей ключа: SELECT * FROM t1 WHERE key2=constant ORDER BY key_part2
- Смешиваются ASC и DESC . SELECT * FROM t1 ORDER BY key_part1 DESC,key_part2 ASC
- Для выборки строк и для сортировки ORDER BY используются разные ключи: SELECT * FROM t1 WHERE key2=constant ORDER BY key1
- Связываются несколько таблиц, и столбцы, по которым делается сортировка ORDER BY , относятся не только к первой неконстантной (const) таблице, используемой для выборки строк (это первая таблица в выводе EXPLAIN , в которой не используется константный, const , метод выборки строк).
- Имеются различные выражения ORDER BY и GROUP BY .
- Используемый индекс таблицы имеет такой тип, который не обеспечивает сортированного хранения строк (как индекс HASH в таблицах HEAP ).
- Столбцы индекса могут содержать значения NULL , и используется ORDER BY . DESC . Это объясняется тем, что в SQL значения NULL всегда сортируются в первую очередь, независимо от того, используется DESC или нет.
В тех случаях, когда MySQL должен сортировать результат, он использует следующий алгоритм:
- Считываются все строки согласно ключу или путем сканирования таблицы. Строки, которые не соответствует предложению WHERE, пропускаются.
- Ключ сортировки сохраняется в буфере сортировки (размера sort_buffer )
- Когда буфер заполняется, содержимое буфера сортируется алгоритмом qsort , результаты сохраняются во временном файле. Сохраняется указатель на отсортированный блок (в том случае, когда все строки умещаются в буфере сортировки, временный файл не создается).
- Вышеупомянутое действие повторяется, пока не будут считаны все строки.
- Делается мультислияние до MERGEBUFF (7) областей в один блок в другом временном файле. Это действие повторяется, пока все блоки из первого файла не окажутся во втором файле.
- Предыдущий пункт повторяется, пока не останется менее MERGEBUFF2 (15) блоков.
- При последнем мультислиянии в результирующий файл записывается только указатель на строку (последняя часть ключа сортировки).
- Теперь код в файле 'sql/records.cc' будет использоваться для чтения данных в отсортированном порядке, с использованием указателей на строки из результирующего файла. Чтобы оптимизировать этот процесс, мы считываем большой блок указателей на строки, сортируем их, и затем считываем строки в отсортированном порядке в буфер строк ( record_rnd_buffer ).
При помощи команды EXPLAIN SELECT . ORDER BY можно проверить, может ли MySQL использовать индексы для выполнения запроса. Если в столбце extra содержится значение Using filesort , то MySQL не может использовать индексы для выполнения сортировки ORDER BY . See section 5.2.1 Синтаксис оператора EXPLAIN (получение информации о SELECT ).
Чтобы сортировка ORDER BY выполнялась с большей скоростью, нужно сначала посмотреть, можно ли заставить MySQL использовать индексы взамен дополнительной фазы сортировки. Если это невозможно, то можно сделать следующее:
Команда ORDER BY
Основные запросы
Условия выборки
Группировка
Сложение строк
Несколько таблиц
Длина строк
Изменение строк
Поиск по строкам
Работа с пробелами
Работа с регистром
Информация
Условия
Полезное
Разное
- Типы полей
- Организация базы данных
создание правильной структуры —> - Подзапросы
- SELECT @min_price:=MIN(price),@max_price:=MAX(price) FROM shop; mysql> SELECT * FROM shop WHERE price=@min_price OR price=@max_price; https://habrahabr.ru/post/133781/ тут еще про переменные цикл получается SET @i = 0; SELECT * FROM product WHERE MOD(@i:=@i+1, 2) = 0; —>Переменные sql
Математические функции
Списки
Извлечение части даты
Получение даты и времени
Преобразование даты
Сложение дат
Тригонометрия
Отдельные символы
Системы счисления
Команда ORDER BY позволяет сортировать записи по определенному полю при выборе из базы данных.
См. также команду LIMIT, которая ограничивает количество выбираемых записей.
Синтаксис
Сортировка по одному полю:
Можно сортировать не по одному, а по многим полям сразу:
По умолчанию записи сортируются по возрастанию, чтобы отсортировать по убыванию — поставьте DESC:
По умолчанию будет сортировка, будто поставлено ASC:
Условие WHERE не обязательно — если его не поставить, будут выбраны все записи:
Примеры
Все примеры будут по этой таблице workers, если не сказано иное:
id айди | name имя | age возраст | salary зарплата |
---|---|---|---|
1 | Дима | 23 | 400 |
2 | Петя | 25 | 500 |
3 | Вася | 23 | 500 |
4 | Коля | 30 | 1000 |
5 | Иван | 27 | 500 |
6 | Кирилл | 28 | 1000 |
Пример
Давайте получим все записи из таблицы и отсортируем их по возрастанию возраста:
SQL запрос выберет строки в следующем порядке:
id айди | name имя | age возраст | salary зарплата |
---|---|---|---|
1 | Дима | 23 | 400 |
3 | Вася | 23 | 500 |
2 | Петя | 25 | 500 |
5 | Иван | 27 | 500 |
6 | Кирилл | 28 | 1000 |
4 | Коля | 30 | 1000 |
Так как выбираются все записи, то блок WHERE можно не указывать:
Можно также указать тип сортировки в явном виде — ASC — результат от этого не изменится:
Пример
Давайте теперь отсортируем записи по убыванию возраста:
SQL запрос выберет строки в следующем порядке:
id айди | name имя | age возраст | salary зарплата |
---|---|---|---|
4 | Коля | 30 | 1000 |
6 | Кирилл | 28 | 1000 |
5 | Иван | 27 | 500 |
2 | Петя | 25 | 500 |
1 | Дима | 23 | 400 |
3 | Вася | 23 | 500 |
Пример
Давайте теперь отсортируем записи одновременно по возрастанию возраста и по убыванию зарплаты.
При этом записи сначала будут сортироваться по возрасту, а те записи, в которых возраст одинаковый (в нашем случае — 23), будут располагаться по убыванию зарплаты:
SQL запрос выберет строки в следующем порядке:
id айди | name имя | age возраст | salary зарплата |
---|---|---|---|
3 | Вася | 23 | 500 |
1 | Дима | 23 | 400 |
2 | Петя | 25 | 500 |
5 | Иван | 27 | 500 |
6 | Кирилл | 28 | 1000 |
4 | Коля | 30 | 1000 |
Пример
Давайте при тех же условиях (т.е. сначала сортировка по возрасту) отсортируем по возрастанию зарплаты.
Теперь первая и вторая запись поменяются местами так, чтобы сначала шла меньшая зарплата, а потом — большая:
SQL запрос выберет строки в следующем порядке:
ORDER BY. Сортировка данных в таблице БД MySQL
Команда ORDER BY
ORDER BY позволяет сортировать записи по одной или нескольким колонкам.
Сортировка возможна в восходящем или нисходящем порядке с помощью ключевых слов ASC и DESC .
По умолчанию используется восходящий порядок сортировки ( ASC ).
Синтаксис ORDER BY
mysql> SELECT column1, column2, . , columnN
-> FROM table_name
-> ORDER BY column1, column2, . , columnN ASC | DESC
Рассмотрим несколько примеров сортировки в таблице books из базы данных Bookstore.
Подключимся к базе данных.
Выведем записи таблицы books отсортированные по цене.
mysql> SELECT id, title, author, price
-> FROM books
-> ORDER BY price;
+—-+—————————+———————+———+
| id | title | author | price |
+—-+—————————+———————+———+
| 4 | Мёртвые души (Акция) | Николай Гоголь | 173.00 |
| 10 | Бесы | Фёдор Достоевский | 212.00 |
| 1 | Дубровский (Акция) | Александр Пушкин | 230.00 |
| 9 | Собачье сердце | Михаил Булгаков | 232.00 |
| 5 | Преступление и наказание | Фёдор Достоевский | 245.00 |
| 2 | Нос (Акция) | Николай Гоголь | 255.20 |
| 3 | Мастер и Маргарита | Михаил Булгаков | 263.00 |
| 6 | Война и мир | Лев Толстой | 341.00 |
| 7 | Анна Каренина | Лев Толстой | 346.00 |
| 8 | Отцы и дети | Иван Тургенев | 371.00 |
+—-+—————————+———————+———+
10 rows in set (0.00 sec)
Если нужно отсортировать в нисходящем порядке, то добавим ключевое слово DESC .
mysql> SELECT id, title, author, price
-> FROM books
-> ORDER BY price DESC ;
+—-+—————————+———————+———+
| id | title | author | price |
+—-+—————————+———————+———+
| 8 | Отцы и дети | Иван Тургенев | 371.00 |
| 7 | Анна Каренина | Лев Толстой | 346.00 |
| 6 | Война и мир | Лев Толстой | 341.00 |
| 3 | Мастер и Маргарита | Михаил Булгаков | 263.00 |
| 2 | Нос (Акция) | Николай Гоголь | 255.20 |
| 5 | Преступление и наказание | Фёдор Достоевский | 245.00 |
| 9 | Собачье сердце | Михаил Булгаков | 232.00 |
| 1 | Дубровский (Акция) | Александр Пушкин | 230.00 |
| 10 | Бесы | Фёдор Достоевский | 212.00 |
| 4 | Мёртвые души (Акция) | Николай Гоголь | 173.00 |
+—-+—————————+———————+———+
10 rows in set (0.00 sec)
Важно заметить, что сортировка по второй колонке будет работать, только тогда когда в первой колонке есть повторяющиеся значения. Если в первой колонке все значения уникальны, то вторая колонка не будет отсортирована, иначе будет нарушена целостность таблицы.
Выведем записи отсортированные по двум колонкам author и price.
mysql> SELECT id, title, author, price
-> FROM books
-> ORDER BY author, price DESC ;
+—-+—————————+———————+———+
| id | title | author | price |
+—-+—————————+———————+———+
| 1 | Дубровский (Акция) | Александр Пушкин | 230.00 |
| 8 | Отцы и дети | Иван Тургенев | 371.00 |
| 7 | Анна Каренина | Лев Толстой | 346.00 |
| 6 | Война и мир | Лев Толстой | 341.00 |
| 3 | Мастер и Маргарита | Михаил Булгаков | 263.00 |
| 9 | Собачье сердце | Михаил Булгаков | 232.00 |
| 2 | Нос (Акция) | Николай Гоголь | 255.20 |
| 4 | Мёртвые души (Акция) | Николай Гоголь | 173.00 |
| 5 | Преступление и наказание | Фёдор Достоевский | 245.00 |
| 10 | Бесы | Фёдор Достоевский | 212.00 |
+—-+—————————+———————+———+
10 rows in set (0.00 sec)
Сортировка данных таблицы MySQL с помощью PHP (PDO)
Создадим файл index.php , в котором отобразим форму с выбором вида сортировки, по типу тех, что делают в интернет-магазинах и выведем саму таблицу со значениями из базы данных.
Каждый раз когда пользователь будет менять вид сортировки, страница будет перезагружаться.
PHP/SQL: ORDER BY or sort($array)?
Как вы думаете, что быстрее в сценарии PHP:
6 Ответов
Это зависит от стольких факторов, что я даже не знаю, с чего начать.
Но, как правило, вы выполняете сортировку на стороне базы данных.
Индексы, сортировки и все такое, они помогают.
Как вы думаете, что быстрее в сценарии php:
ORDER BY не выполняется в сценарии PHP — он выполняется в базе данных, прежде чем данные будут извлечены сценарием PHP. Извините, если это покажется вам педантичным, но я просто хочу убедиться, что вы это понимаете.
В любом случае, причина, по которой я бы использовал ORDER BY , заключается в том, что база данных имеет доступ к индексам и кэшированным страницам из базы данных. Сортировка в PHP сортирует набор данных в памяти, конечно, но не имеет доступа ни к одному индексу.
По моему мнению, ничто не сравнится с реальным выбором времени, так что вы действительно, действительно знаете наверняка:
Если в первом запросе есть LIMIT, а набор строк, которые будут совпадать без LIMIT, намного больше, чем LIMIT, то порядок по запросу будет DEFINITELY быстрее.
То есть, если вам нужны первые 50 строк из таблицы 10 000 строк, гораздо быстрее выполнить сортировку базы данных для вас и вернуть только эти верхние 50 строк, чем получить все 10 000 строк и отсортировать их самостоятельно в PHP. Это, вероятно, представитель подавляющего большинства того, что произойдет в реальных приложениях
Если и есть какие-то случаи, в которых сортировка в PHP даже сравнима, то они немногочисленны и далеки друг от друга.
Кроме того, сортировка SQL намного эффективнее-она тривиальна для сортировки по нескольким столбцам, подзапросам, возвращаемым значениям агрегатных функций и т. д.
Если упорядоченное поле индексируется, я бы сказал, Вероятно, запрос SQL. Если нет, я не уверен, но я не могу представить, что это будет слишком заметно в любом случае, если вы не имеете дело с абсурдно большим количеством строк.
Заказ по почти всегда будет быстрее.
Похожие вопросы:
Я опубликовал это на разных форумах, но пока не повезло (надеюсь, что его можно опубликовать и здесь?). Я пытался для нескольких weeks. no успеха. У меня есть две страницы в моем блоге (самые.
Правда ли, что ORDER BY обычно довольно медленный? Я пытаюсь запустить некоторые операторы sql, где предложение WHERE довольно простое, но затем я пытаюсь использовать ORDER BY в индексированном.
это основной вопрос, но Оба используются для сортировки данных и оба имеют ту же функциональность как performe asc по умолчанию что такое разница sort Order by
У меня есть метод php, который должен удалить все случаи появления оператора order by mysql из строки запроса mysql. Пример 1 : STRING: SELECT * FROM table ORDER BY name RESULT: SELECT * FROM table.
Мне нужен параметр MySQL ORDER BY FIELD, чтобы упорядочить потоки с форума. Вот точная команда SQL: $ids — это 19,3,12,256,1023 SELECT* FROM Threads WHERE ID IN ($ids) LIMIT $untere_schranke, 50.
Я хочу использовать prepared statement, в котором передаваемые параметры предназначены для ORDER BY и LIMIT предложений, например: $sql = ‘SELECT * FROM table ORDER BY :sort :dir LIMIT :start.
Я делаю систему инвентаризации для кого-то. Я хочу иметь возможность щелкнуть ссылку в заголовке таблицы и заставить ее Сортировать по PN и ASC. Затем, если я снова нажму PN, на DESC. Но я также.
ЧТОБЫ БЫТЬ ЯСНЫМ, Я НАМЕРЕННО ПЫТАЮСЬ ВВЕСТИ В СВОЙ СОБСТВЕННЫЙ САЙТ. Я пытаюсь ввести в один из моих сайтов, используя оператор order by, чтобы попытаться выяснить, сколько столбцов находится в.
Я нашел простое решение, чтобы сделать возможным сортировку по каждому столбцу в моей html-таблице. Теперь я также хочу сделать возможным сортировку по каждому столбцу, кроме desc, но с моей идеей.
Предупреждаю: я уверен, что мой код неуклюж и неэффективен, пожалуйста, не стесняйтесь вызывать меня на него. Я довольно новичок в этом деле. Я пытаюсь упорядочить результаты запроса по столбцу.