3

MySQLにデータセットがあり、制限の使用はすでにコストのかかるクエリであり、結果の数を見つけることもコストがかかります。したがって、結果の数を見つけるために別のクエリを実行することは避けたいと思います。制限がサブクエリ内にあるため、MYSQL_CALC_FOUND_ROWSを使用できません。

SELECT * FROM items,
(
  SELECT
    item_id
  FROM
    (etc)
  WHERE
    some.field=<parameter>
  AND (etc)
  GROUP BY (something)
  ORDER BY (something_else) DESC
  LIMIT 15
) subset
WHERE item.id=subset.item_id

結合アイテムを残してサブクエリを削除し、MYSQL_CALC_FOUND_ROWSを使用できるようにすることもできますが、これは非常に非常に低速です。私はすべてのインデックスの最適化を試しましたが、それが問題外であると仮定しましょう。

これは今や設計上の問題になります...最後のページがわからないときにユーザーがこのデータをページングできるようにするにはどうすればよいですか?私はそれらが行き過ぎているかどうかだけを知っています(例えば:クエリは結果を返しません)。

4

2 に答える 2

6

MySQLの第一人者であるBaronSchwartzによる記事の要約は次のとおりです。

http://www.mysqlperformanceblog.com/2008/09/24/four-ways-to-optimize-paginated-displays/

ページ表示を最適化する4つの方法

  1. 最初のクエリで、すべての結果をフェッチしてキャッシュします。

  2. すべての結果を表示しないでください。グーグルでさえあなたに百万番目の結果を見ることができません。

  3. 総数や他のページへの中間リンクは表示しないでください。「次の」リンクのみを表示します。

  4. 結果がいくつあるかを見積もります。繰り返しますが、Googleはこれを行い、誰も文句を言いません。

于 2008-12-07T06:00:48.683 に答える
0

それを強化するために、「いくつ」という概念はとにかく非常に一時的なものです。答えがユーザーに届くまでに、それは簡単に間違っている可能性があります。

于 2008-12-07T06:40:48.320 に答える