mysql|ページネーション|最適化
著者: steeven
ページングについて議論している人はほとんどいないようですが、皆さんは、limit m,n に夢中ですか?
インデックス作成の場合は、limit m,n で十分高速ですが、複雑な条件で検索する場合は、
何かが見つかりません。 order by somefield+somefield
mysql はデータベースを検索し、条件を満たす「すべて」のレコードを見つけて、m,n 個のレコードを取り出します。
データ量が数十万で、ユーザーが非常に人気のある単語を検索する場合、
昔の夢を追体験するために最後の数ページを読まなければなりません。 。 。 Mysql は非常に悲惨な状況になり、ハードディスクを操作し続ける必要があります。
そこで、mysql にページングも保存させてみることができます。もちろん、プログラムは連携する必要があります。
(これは単なるアイデアです。皆さんも議論してください)
ASP ページング: ASP システムには、ページングを実装するための Recordset オブジェクトがありますが、大量のデータがメモリに配置されるため、いつ有効期限が切れるかはわかりません (ASP 専門家にお願いします
ガイダンス)。
SQL データベース ページング: ストアド プロシージャとカーソルを使用したページング。
必要な結果を取得するために 1 つのクエリを使用する場合を想像してください。 ID が設定されているため、後続のページが必要な場合は、結果の ID に従って関連するレコードを読み出します。この方法では、このクエリのすべての ID を保持するのに必要なスペースはわずかです (クエリ結果は SQL ですが、期限切れのガベージをクリアする方法がわかりません?)
この方法で、mysql はストレージ ページング メカニズムをシミュレートできます。 :
1. select id from $table where $condition order by $field limit $max_pages*$count;
条件を満たす ID をクエリします。
条件を満たすレコードの最大数を制限するか、追加しません。
2. PHP のすべての変数は実行後に失われるため、次のことを検討できます:
オプション a. mysql で一時テーブルを作成し、一意の識別子として時刻または乱数を使用してクエリ結果を挿入します。
page1~pagen フィールドを作成します。各フィールドは、1 つの ID が 1 つのレコードに対応するように、ページに必要な ID を保存します。ファイルを保存します。
$IDs 配列 $IDs[1]~$IDs[$max_pages] を作成します。ユーザーが同時に複数の
ウィンドウを開いてクエリを実行する場合があることを考慮して、クエリを回避するために $ids に一意のマークを付ける必要があります。相互に上書きした結果です。 2 次元配列
と $$var はどちらも良いアイデアです。
3. 各ページのリクエストで、「,」で区切られた対応する ID を直接見つけます。
select * from $table where id in ($ids); 速度は非常に高速です
4.結果は自動クリアとみなされる必要があります。タイマーを設定するか、比例してランダムにクリアすることができます。 mysql 一時テーブルを使用する場合は、タイムスタンプフィールドを追加する必要があり、一定期間操作されなかった場合はセッションに $IDs["time"]=time() を追加します。期限切れデータとして。
5. 最適化したい場合は、1 と 2.a のステートメントを select... into ....にマージすることを検討してください。
注:
1. 上記は単なる mysql のパッチ適用ソリューションです。 mysql はいつこれらの機能を追加しますか? 2. 他のデータベースにも適用できます。
3. 他のデータベースにさらに高度なページング方法がある場合は、私に知らせるか、steeven@kali.com.cn にメールしてください。
4. クエリするデータが本当にたくさんある場合は、SQL と Oracle の両方が提供する mysql に別れを告げてください。より高度なキーワード インデックス クエリ。
卓越性を目指して、上記は単なる紹介にすぎません。ページネーションの問題について一緒に議論することを歓迎します。 (他のデータベースに関するものでも構いません)
いつか、初心者向けにさまざまなページング方法が整理されて参考になることを願っています。