2010-12-07 1 views
0

表Xに100のタプルがあるとします。ORDER BY句なしで "SELECT * .. LiMIT start、count"を使用してMySQLのテーブルをスキャンするのは正しいですか?

Xをスキャンする次のアプローチは、MySQLでは表Xのすべてのタプルを生成しますか?

 
for start in [0, 10, 20, ..., 90]: 
    print results of "select * from X LIMIT start, 10;" 

私ははっきりとこのアプローチneed not workと言うのPostgreSQLを使用して、しかしMySQLには、そのような情報はないと思われてきたので、私は、お願いします。そうでない場合は、テーブルに関する他の情報(プライマリキーフィールドのようなもの)を知らなくても、結果を固定順序で返すことができますか?

アプリケーションのテーブルで各タプルをスキャンする必要があります。アプリケーションであまりにも多くのメモリを使用せずに(単に "select * from X"を実行して)行う方法が必要です。

答えて

1

InnodbまたはMyISAMテーブルタイプを使用している場合、より良いアプローチはHANDLERインターフェイスを使用することです。唯一のMySQLはこれをサポートしていますが、それはあなたが欲しいものを行います。

  1. 店の結果:このモードでは、など

    http://dev.mysql.com/doc/refman/5.0/en/handler.html

    はまた、MySQLのAPIは、サーバーからデータを取得する2つのモードをサポートしていますクエリが実行されるとすぐに、APIはユーザーコードに戻る前に結果セット全体を取得します。これにより、多くのクライアントメモリのバッファリング結果が使用される可能性がありますが、サーバー上のリソースの使用は最小限に抑えられます。

  2. 使用結果:このモードでは、APIは行ごとに結果を取得し、ユーザーコードに制御を頻繁に返します。これにより、クライアント上でのメモリの使用は最小限に抑えられますが、サーバーではロックを長く保持できます。

さまざまな言語のほとんどのMySQL APIは、これを1つの形式でサポートしています。これは、通常、接続を作成するときに指定できる引数、または既存の接続に対してそのモードに切り替えるために使用できる別の呼び出しです。

だから、あなたの質問への答えに - 私はどうなる次の行は、ループの中に挿入されている

set the connection to "use result" mode; 
select * from X 
+0

うわー!使用結果は、医師が私のアプリのために注文したものです。答えてくれてありがとう! – donatello

3

いいえ、これは安全な前提ではありません。 ORDER BY句がないと、クエリが毎回一意の結果を返すことは保証されません。この表が適切に索引付けされている場合は、索引用にORDER BYを追加することはあまりにも高価であってはなりません。

編集:Non ORDER BY編集結果時々はクラスタ化インデックスの順番になるはずですが、私はそれにお金をかけません!

+0

場合は、何も 'ORDER BY'句で、それは順序が中断されません保証しませんトランザクションセーフ接続でない限り – Danosaure

関連する問題