0

テーブル内の行を表示できる Web サイトがあります (各行は画像です)。100,000 を超える行があります。行のさまざまなサブセットを表示したり、さまざまな並べ替え順序で表示したりできます。行の 1 つを表示しているときに、[次へ] または [前へ] ボタンをクリックして、リストの次/前の行に移動できます。

Web サイトの「次へ」と「前へ」の機能をどのように実装しますか?

より具体的には、最大 100,000 行以上のリストを返す任意のクエリがあり、誰かが表示している現在の行に関する情報を知っている場合、次の行を効率的に決定するにはどうすればよいでしょうか?

これは、Web サイトが若いときに思いついたソリューションの疑似コードです。1000 行しかないときはうまく機能しましたが、100,000 行になった今ではメモリを使いすぎていると思います。

int nextRowId(string query, int currentRowId)
{
    array allRowIds = mysql_query(query);  // Takes up a lot of memory!
    int currentIndex = (index of currentRowId in allRowIds);  // Takes time!
    return allRowIds[currentIndex+1];
}

この問題について考えている間、Web サイトは現在の行に関する ID 以外の情報 (結果セット内の現在の行の位置など) を保存できることを思い出してください。この情報は、次の行の ID を決定するのに役立ちます。

編集: これについて言及せずに申し訳ありませんが、これは単なる静的な Web サイトではありません。多くの場合、行をリストに追加したり、リスト内で行を並べ替えたりすることができます。(非常にまれですが、行がリストから削除される可能性があります。) 私はそのようなことについて心配する必要があると思いますが、そうでない場合は、あなたが私を納得させることができるかもしれません。

4

3 に答える 3

4

クエリにLIMIT節を適用してみましたか?

MySQLのマニュアルより

LIMIT 句を使用して、SELECT ステートメントによって返される行数を制限できます。LIMIT は 1 つまたは 2 つの数値引数を取り、どちらも非負の整数定数でなければなりません (準備済みステートメントを使用する場合を除く)。

2 つの引数がある場合、最初の引数は返す最初の行のオフセットを指定し、2 番目の引数は返す行の最大数を指定します。

SELECT * FROM tbl LIMIT 5,10;  # Retrieve rows 6-15

引数が 1 つの場合、値は結果セットの先頭から返す行数を指定します。

SELECT * FROM tbl LIMIT 5;     # Retrieve first 5 rows
于 2009-07-05T00:20:01.313 に答える
1

オフセットは大規模なデータ セットに対する非常にコストのかかる操作です。mySQL での効率的なページングについて詳しくは、このプレゼンテーションをご覧ください: http://www.scribd.com/doc/14683263/Efficient-Pagination-Using-MySQL

于 2010-05-14T18:20:42.137 に答える
0

mysql limit 句を使用します。のようにselect * from tableA limit 0,100;

0 と 100 を自然にパラメータ化し、フォームまたは必要な場所に保存することで、ユーザーが [次へ] をクリックしたときに使用するオフセットを知ることができます。そのため、レンダリングする次/前のページごとにクエリを再実行する必要があります。

于 2009-07-05T00:19:21.940 に答える