Каков порядок выбора по умолчанию в PostgreSQL или MySQL? - PullRequest
2 голосов
/ 08 марта 2020

Я прочитал в PostgreSQL документах, что без оператора ORDER SELECT будет возвращать записи в неопределенном порядке.

Недавно во время интервью меня спросили, как ВЫБРАТЬ записи в том порядке, в котором они вставляется без PK или create_at или другого поля, которое можно использовать для заказа. Старший разработчик, который брал у меня интервью, настаивал на том, что без заявления ORDER записи будут возвращены в том порядке, в котором они были вставлены.

Верно ли это для PostgreSQL? Это правда для MySQL? Или любая другая РСУБД?

Ответы [ 3 ]

4 голосов
/ 08 марта 2020

Я могу ответить за MySQL. Я не знаю для PostgreSQL.

Обычно порядок по умолчанию не является порядком вставки.

В случае InnoDB порядок по умолчанию зависит от порядка индекса читать по запросу. Вы можете получить эту информацию из плана EXPLAIN.

Для MyISAM он возвращает заказы в порядке их чтения из таблицы. Это может быть порядком вставки, но MyISAM будет повторно использовать пробелы после удаления записей, поэтому более новые строки могут быть сохранены ранее.

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

Так что если вам нужны результаты в указанном порядке c, вам следует использовать ORDER BY по вашим запросам.

3 голосов
/ 08 марта 2020

После ответа Б.К. и в качестве примера ...

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table(id INT NOT NULL) ENGINE = MYISAM;

INSERT INTO my_table VALUES (1),(9),(5),(8),(7),(3),(2),(6);

DELETE FROM my_table WHERE id = 8;

INSERT INTO my_table VALUES (4),(8);

SELECT * FROM my_table;
+----+
| id |
+----+
|  1 |
|  9 |
|  5 |
|  4 | -- is this what
|  7 |
|  3 |
|  2 |
|  6 |
|  8 | -- we expect?
+----+
2 голосов
/ 08 марта 2020

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

При MySQL (InnoDB) мы наблюдаем, что строки обычно возвращаются в порядке по индексу, используемому в плане выполнения, или по ключу кластера таблицы.

Это нетрудно создать пример ...

CREATE TABLE foo 
( id INT NOT NULL
, val VARCHAR(10) NOT NULL DEFAULT ''
, UNIQUE KEY (id,val) 
) ENGINE=InnoDB; 

INSERT INTO foo (id, val) VALUES (7,'seven') ;
INSERT INTO foo (id, val) VALUES (4,'four') ; 

SELECT id, val FROM foo ; 

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

  id   val
----   ----- 
   4   four
   7   seven 

Не совсем ясно, какой смысл пытался сделать интервьюер. Если интервьюер пытается продать идею, учитывая требование вернуть строки из таблицы в том порядке, в котором они были вставлены, запрос без предложения ORDER BY будет ever правильным решением. не покупая его.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...