2

"High Performance MySQL 2nd Edition" の "Optimizing Sorts" セクションを読んでいると、次のことを理解するのが難しいと思います。

mysql> SELECT FROM プロファイル WHERE sex='M' ORDER BY rating LIMIT 100000, 10;

このようなクエリは、インデックスがどのように作成されていても深刻な問題になる可能性があります。オフセットが大きいと、ほとんどの時間を大量のデータのスキャンに費やす必要があり、その後破棄されるからです。
...
このようなクエリを最適化するためのもう 1 つの優れた戦略は、カバリング インデックスを使用して、最終的に取得する行の主キー列だけを取得することです。...効率的に機能するために(性別、評価)のインデックスが必要な例を次に示します。

mysql>SELECT (列) FROM プロファイル INNER JOIN (
-> SELECT (主キー列) FROM プロファイル
-> WHERE x.sex='M' ORDER BY rating LIMIT 100000, 10
->) AS x USING(主キー列);

私の質問は、最初のクエリが (性別評価) インデックスを利用して行 100000-100010 を見つけることができない場合、2 番目のクエリはどのように行うのでしょうか?

4

1 に答える 1

0

「高性能MySQL 2nd Edition」より

このようなクエリは、インデックスがどのように作成されていても深刻な問題になる可能性があります。オフセットが大きいと、ほとんどの時間を大量のデータのスキャンに費やす必要があり、その後破棄されるからです。非正規化、事前計算、およびキャッシュは、このようなクエリで機能する唯一の戦略である可能性があります。さらに優れた戦略は、ユーザーに表示させるページ数を制限することです。検索結果の 10,000 ページ目を気にする人はいないため、これがユーザー エクスペリエンスに影響を与える可能性はほとんどありません。

このようなクエリを最適化するためのもう 1 つの優れた戦略は、カバリング インデックスを使用して、最終的に取得する行の主キー列だけを取得することです。その後、これをテーブルに結合して、必要なすべての列を取得できます。これにより、 MySQL が破棄するだけのデータを収集しなければならない作業量を最小限に抑える ことができます。

このクエリにはこれ以上の改善はないと述べられています。選択された列の数を列だけに最小限に抑えることをお勧めしindexます(もちろん、スキャンプロセス中に10,000行のすべての列のすべてのデータを保存するメモリを節約して、10,000行のインデックス列のみを保存します)。次に、取得した 10 個のインデックスを使用して、完全な列を作成します。

于 2013-06-06T03:20:07.467 に答える