Driver86
@Driver86
Немодератор toster.ru

Как mysql/mariadb сортирует одинаковые значения?

Есть запрос вида:
select * from table order by field;
Как будут отсортированы строки с одинаковым field?
1. Случайно.
2. В порядке вставки.
3. Хз.
4. ???
  • Вопрос задан
  • 66 просмотров
Пригласить эксперта
Ответы на вопрос 3
@mayton2019
Bigdata Engineer
В программировании различают понятие стабильная сортировка (stable sort) когда подряд идущие одинаковые ключи в массиве при сортировке также идут в той-же последвательности со значениями. Но это работает только для массивов.

Реляционная алгебра не определяет никаких массивов. Собственно мы не знаем порядка как хранятся кортежи в таблице. Более того. Оптимизация пространства в БД может их тасовать как колоду карт. Тот-же вакуум в Постгресе. Или работа пакетов DBMS_SPACE для Oracle. Или любое delete+insert может сломать порядок который был раньше.

Поэтому применительно к БД такой вопрос лишен смысла. Если вам нужен какой-то дополнительный ранг сортировки - вводите новое поле (sequence_num) и сортируйте по field,sequence_num. Тогда будет порядок.
Ответ написан
Комментировать
Fockker
@Fockker
Потомок старинного рода Ипатьевых-Колотитьевых
В целом п.3
Обеспечивать случайность - это затратная операция, её никто просто так делать не будет. Скорее всего, имелся ввиду неопределённый порядок, а не случайный. Который как раз и подходит под п.3

Если сразу после добавления, то может в порядке вставки, но это не точно, поскольку запись может идти не линейно, а на место записей, помеченных, как удалённые. Плюс после удалений/обновлений физический порядок записей в файле тоже может меняться, и соответственно, порядок выдачи.
В целом ответ - никак не сортирует, берет первую попавшуюся.
Ответ написан
Комментировать
@Vitsliputsli
Они не будут сортироваться, т.е. будут взяты, как прочитаны. Порядок при чтении зависит от движка, если говорить про InnoDB, то в нем данные сортированы по первичному ключу. Этот порядок зависит лишь от внутренних механизмов движка и не гарантируется, расчитывать на него и использовать в ПО нельзя.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы