上位n個の行を選択しますだから私は、長い数百万行、おそらく、テーブルを持っている効率的
user | points
---------------
user1 | 10
user2 | 12
user3 | 7
...
とSELECT * FROM mytable ORDER BY points LIMIT 100, 1000
にしたい今では正常に動作しますが、それは拒否しているので、(巨大なテーブル上)恐ろしく遅いです任意の種類の索引を使用できますが、全表スキャンを実行します。これをより効率的にするにはどうすればいいですか?
私の最初の(わかりやすい)アイデアはpoints DESC
のインデックスを使用していましたが、MySQLがそれらをまったくサポートしていないことが分かりました。それは
最後のソートにインデックスを使用doesntのため、
次に、私は、どちらか、基本的にポイント超の上昇率を有する意味、ポイントの記号を逆にするこのdidntはヘルプを試してみました、私はforce index
を使用してみました、このまだテーブル全体をフェッチしているので、ほとんどのパフォーマンスの改善は得られませんでした(ファイル番号:EXPLAIN
でfilesort:falseを使用)
私はこの問題を解決する必要がありますが、オンラインで役立つ情報は見つかりませんでした。どんなヒントも大歓迎です。
テーブル内に「何百万もの行」がある場合は、実行しているハードウェア用のデータベースが大きすぎることがあります。しかし、構造そのものは、それに関連しています。あなたのデータベースは単にユーザー/ポイントですか?のように、主キーはvarcharですか?または? – Eoghan
これはどのように「トップn」ですか? – Strawberry
@Strawberry MySqlが 'top n'をサポートしているとは思いませんか? –