Как mysql упорядочивает строки с одинаковыми значениями - PullRequest
14 голосов
/ 12 июля 2011

В моей базе данных есть несколько записей, где я сортирую по тому же значению:

| col1 | timestamp              |
| row1 | 2011-07-01 00:00:00    |
| row2 | 2011-07-01 00:00:00    |
| row3 | 2011-07-01 00:00:00    |

SELECT ... ORDER BY timestamp

Похоже, что результат в случайном порядке. Является ли случайный порядок последовательным. Это означает, что если у меня есть эти данные на двух серверах mysql. Могу ли я ожидать того же результата?

Ответы [ 5 ]

10 голосов
/ 12 июля 2011

Я бы посоветовал не делать этого предположения.В стандартном SQL все, что не требуется явным предложением ORDER BY, зависит от реализации.

Я не могу говорить о MySQL, но, например, для SQL Server порядок вывода для строк, которые до сих пор "равны"что касается ORDER BY, то оно может меняться при каждом выполнении запроса - и на него может влиять практически что угодно (например, уровень исправления / пакета обновления сервера, рабочая нагрузка, какие страницы в настоящее время находятся в пуле буферов и т. д.).

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

6 голосов
/ 16 августа 2013

Много ответов уже есть, но нижняя строка ответа НЕТ .

Если вы хотите, чтобы строки возвращались в определенной последовательности последовательно, укажите это в ORDER BY. Без этого нет абсолютно никакой ГАРАНТИИ, в каком порядке будут возвращены строки заказа.

Я думаю, что вы можете упустить то, что в предложении ORDER BY может быть несколько выражений. И вы можете включить выражения, которых нет в списке SELECT.

В вашем случае, например, вы можете использовать ORDER BY timestamp, id.

(или некоторые другие столбцы или выражения.)

Это упорядочит строки сначала по метке времени, а затем все строки с одинаковым значением для метки времени будут упорядочены по id, или каково бы ни было следующее выражение в этом списке.

2 голосов
/ 16 августа 2013

В условии ORDER BY, если строки имеют одинаковые значения или если вы хотите упорядочить данные, выбрав оператор ORDER BY.СЛУЧАЙ: Вы хотите ЗАКАЗАТЬ ПО значениям столбца частоты слова.И два слова в таблице могут иметь одинаковое значение частоты в столбце встречаемости частоты. Таким образом, в столбце частоты у вас будут две одинаковые частоты двух разных слов.Таким образом, в «select * from database_name ORDER BY частота» вы можете найти любое из двух слов, имеющих одинаковую частоту, появляющихся непосредственно перед последним.А во втором прогоне другое слово, которое показывалось после того, как первое слово появилось раньше.Это зависит от буферной памяти, страниц, входящих и выходящих в данный момент и т. Д.

2 голосов
/ 12 июля 2011

Это зависит от используемого механизма хранения. В MyISAM они будут упорядочены в естественном порядке (то есть в том порядке, в котором они хранятся на диске - это можно изменить с помощью команды ALTER TABLE ... ORDER BY). В InnoDB они будут заказаны PK. Другие двигатели могут иметь свои собственные правила.

1 голос
/ 25 мая 2016

Ответ: нет, порядок не будет последовательным. Я столкнулся с той же проблемой и решил, добавив еще один столбец в раздел заказа. Убедитесь, что этот столбец уникален для каждой записи, например «ID» или любого другого.

В этом случае вы должны добавить в таблицу поле «ID», которое является уникальным для каждой записи. Вы можете назначить ему «AI» (автоинкремент), чтобы не заниматься обслуживанием.

После добавления столбца 'ID' обновите последнюю часть вашего запроса следующим образом:

SELECT mt.*
FROM my_table mt
ORDER BY mt.timestamp ASC, mt.id DESC
...