Надежность порядка чтения таблиц MySQL - PullRequest
1 голос
/ 10 ноября 2011

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

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

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

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

Спасибо C

Ответы [ 3 ]

2 голосов
/ 10 ноября 2011

Если вы используете следующий запрос, у вас не должно быть проблем,

SELECT columns
FROM tables
WHERE predicates
ORDER BY column ASC/DESC;
1 голос
/ 10 ноября 2011

Если вы используете стандартный коннектор MySQL C ++, то, согласно справочному руководству , «Предварительная версия буферизует все наборы результатов на клиенте для поддержки курсоров».

Мой опыт обычно также буферизован и поэтому не изменяется при изменении базовой таблицы.

0 голосов
/ 10 ноября 2011

Вы правы. При чтении таблицы MySQL строка за строкой из приложения небезопасно предполагать , что таблица будет всегда читаться сверху вниз, одна за другой в идеальном последовательном порядке. Небезопасно предполагать, , что если таблица упорядочена по уникальному идентификатору, и я читаю ее (через C ++ или иным образом) по одной строке за раз, вы будете получать каждую строку в точном порядке уникального идентификатора каждый время.

На любую СУБД это не гарантируется. Никто не должен полагаться на это предположение.

Строки не имеют (Чтение: не должно иметь) внутреннего порядка или порядка по умолчанию в реляционных таблицах. Таблицы (отношения) по определению являются неупорядоченными множествами или строками.

Создается впечатление, что большинство систем, когда их просят вернуть результат для запроса, подобного:

SELECT columns
FROM table

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

Если в предложении FROM несколько таблиц или есть условия WHERE, это совершенно другая ситуация, поскольку не все таблицы читаются, могут использоваться разные индексы, поэтому система может не прочитать файлы таблиц, но только файлы индекса. Или прочитайте небольшую часть таблиц.

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

Вывод: в ваших запросах должна быть часть ORDER BY, если вы хотите каждый раз гарантировать один и тот же заказ.

...