2009-08-11 7 views
1

私はmysqlテーブルにデータを収集するアプリケーションを持っています。テーブルには一意のID列がないため、idで特定の行を参照することはできません。MYSQLテーブルの行の順序は固定されているため、クエリは常にその順序でそれらを返します。

毎日テーブルに追加された新しい行をダンプして別の場所にアップロードするダンプアプリケーションを作成したいと思います。一意のIDフィールドを追加し、最後のIDを格納することでこれを行うことができますが、IDカラムをテーブルに追加する必要はありません。

だから私はすべてのダンプでテーブルの行数を格納し、次回テーブルがダンプされるときにオフセットとしてその数値を使用すると考えました(select * from table limit verylargenumber offset x)。もちろん、常に新しい行がテーブルの最後に挿入されるという保証がある場合にのみ機能します。したがって、新しい行はすべてオフセットの後になります。

私はそれに頼ることができます。私は正しい?

+0

回答ありがとうございます。私はデータベースがアクセスを最適化するためにインデックスだけを使用し、物理的なものには触れないと思った。私は間違っていた。 –

答えて

4

これは該当しません。データベースは、最適化とクエリーの高速化のために動き回ります。任意の順序を保証するために、order by句をクエリに追加する必要があります。ユニークなIDをテーブルに追加することを検討する必要があります。

+0

データベースエンジンが「最適化してクエリをより速くするために動く」と思っています。本当にそうです。怠惰なブンは何もしません - 私は何も言わない。 – ChssPly76

+0

それはあなたが信頼できるものではありません。最終的には、そうなるでしょう。 – markus

1

いいえ、そうではありません。エンジンが行を返す順序は保証されていません。一意のIDを持たない表は、一般的にそのようなゴッド・アイデアではありません。この場合、あなたは確かに1つを使用するのに十分な理由があります。

1

ファイルシステムと同様に、テーブルが最適化または最適化されていない限り、削除されたデータは新しいデータが挿入される「スロット」を解放します。テーブルの最後に必ずしも付加されるとは限りません。あなたにDを挿入した場合、あなたはBを削除する場合は、あなたのテーブルには、基本的にA、[空き領域]のようになります。A、B、C

C

ので

だから、あなたが3行を持っていると言いますあなたのテーブルは、今のようになります:A、D、C

あなたの最良の賭けは、ユニークな自動インクリメントキーを使用することです。これにより、クエリの処理速度も向上します。

関連する問題