1

答えはなんとなく論理的だと思いますが、ここに行きます。

3 つの列で結合された 3つの大きなテーブルがあり、各列は主キーの一部です。列1で個別の選択を取得したい。

結果全体を一度に取得すると機能します。つまり、結果をファイルにエクスポートします。しかし、phpadmin のようにページ分割するとLIMIT 1000, 0、column1 の値が 2 回取得されます。たとえば、1 ページ目の val1 と最後のページの val1 です。これは、本来あるべき値が返されていないことも意味します。を追加すると、ORDER BY column1すべて問題ありませんが、最後のページで速度が低下するか、そう言われました。

mysql がページネーションを処理し、実際には結果全体を知らずに結果を返す方法と関係があると思いますが、それでも私のバグです。誰でもそれについて詳しく説明できますか。

クエリをページ分割する理由は、テーブルを一度に長時間ロックするのが好きではないためです。これを達成し、同時にすべてのデータを取得する方法を知っている人はいますか?

4

1 に答える 1

3

ORDER BY なしで LIMIT を使用してページングを実装しても意味がありません。

サーバーは任意の結果を任意の順序で自由に返すことができ、結果はクエリごとに一貫している必要がないためです。

正確で一貫した結果が必要な場合は、ORDER BY が必要です。パフォーマンスが気になる場合は、順序付けを行っている列のインデックスを追加することを検討してください。

マニュアルページからLIMIT optimization

ORDER BY で LIMIT row_count を使用する場合、MySQL は、結果全体をソートするのではなく、ソートされた結果の最初の row_count 行が見つかるとすぐにソートを終了します。インデックスを使用して順序付けを行う場合、これは非常に高速です。


クエリをページ分割する理由は、テーブルを一度に長時間ロックするのが好きではないためです。これを達成し、同時にすべてのデータを取得する方法を知っている人はいますか?

すべての行で何らかの操作を実行しようとしている場合、データを追加または削除できる場合、そのアプローチは機能しません。これは、後続のすべての行がプッシュされ、一部の行が別のページに移動されるためです。行を追加すると、いくつかの行が次のページにプッシュされます。つまり、1 つの行が 2 回表示されます。前のページから行を削除すると、行がスキップされます。

代わりに、次のいずれかの方法を使用できます。

  • idどこまで進んだかを追跡するためにいくつかを使用してください。より大きい次の n 行を選択しidます。
  • ブール値を列に格納して、処理した行を記録します。まだ処理していない n 行を選択します。
于 2012-06-15T22:58:48.640 に答える