1

アプリケーションからMySQLテーブルを1行ずつ読み取るときに、テーブルは常に上から下に、完全な順序で次々に読み取られると想定しても安全ですか。

EGテーブルが一意のIDで並べ替えられていて、C++を介して一度に1行ずつ読み込んだ場合。毎回正確に一意のIDの順序で各行を取得すると想定しても安全ですか。

私の直感は、それは安全な仮定ではないということですが、そのための技術的な理由はありません。

私のテストでは、テーブルの行が順番に提供されることが常に示されていますが、それに依存するのは緊張します。結果として、私はプログラムをこの仮定に依存しないように作成します。これにより、プログラムは少し複雑になり、効率が少し低下します。

ありがとうC

4

3 に答える 3

2

次のクエリを使用する場合、問題はありません。

SELECT columns
FROM tables
WHERE predicates
ORDER BY column ASC/DESC;
于 2011-11-10T10:04:37.653 に答える
1

標準のC++MySQLコネクタを使用している場合は、リファレンスマニュアルによると、「プレビューバージョンは、カーソルをサポートするためにクライアント上のすべての結果セットをバッファリングします」。

また、一般的に、結果セットはバッファリングされているため、基になるテーブルが変更されても変更されないというのが私の経験です。

于 2011-11-10T10:18:18.973 に答える
0

あなたが正しいです。アプリケーションからMySQLテーブルを1行ずつ読み取るときに、テーブルが常に上から下に、完全な順序で次々に読み取られると想定するのは安全ではありません。テーブルが一意のIDで並べ替えられていて、一度に1行ずつ(C ++またはその他の方法で)読み込んだ場合、毎回正確に一意のIDの順序で各行が取得されると考えるのは安全ではありません。

どのRDBMSでも、その保証はありません。誰もその仮定に頼るべきではありません。

行には、リレーショナルテーブルに固有の順序またはデフォルトの順序がありません(読み取り:持つべきではありません)。テーブル(関係)は、定義上、順序付けされていないセットまたは行です。

この印象を与えるのは、ほとんどのシステムが次のようなクエリの結果を返すように求められたときです。

SELECT columns
FROM table

ディスクからすべての行を取得し、ファイル全体を読み取ります。そのため、ファイルに保存された順序またはクラスター化されたキーの順序(MySQLのInnoDBテーブルなど)で行を(通常は)返します。したがって、毎回同じ順序で結果を返します。

FROM句に複数のテーブルがある場合、またはWHERE条件がある場合は、まったく異なる状況になります。テーブル全体が読み取られるのではなく、異なるインデックスが使用される可能性があるため、システムはテーブルファイルを読み取らず、インデックスファイルのみを読み取る場合があります。または、表のごく一部を読んでください。

パーティション化されたテーブルや分散データベースがある場合も、話は異なります。

結論として、ORDER BY毎回同じ順序を保証したい場合は、クエリに参加する必要があります。

于 2011-11-10T10:31:17.950 に答える