私は大規模なデータベーステーブルを使用していましたが、100万行を超えるデータがあり、何らかの「ユーザーランク」を思いついていますが、他の方法と比較して非常に遅いです。このデータを使用して、間違った方法で行っているのかどうか疑問に思っていました。 私は、2つの列id
とpoints
を持つデータのすべての行をポイント単位でグルーピングしていますので、同じポイントの人々は同じランクになり、降順で並べ替えられます。データの行のレコードを取得する最も速い方法は何ですか?
ここでクイックスローが一緒だ、私はそれをテストしました:
<?php
session_start();
$rank = 0;
$query = $conn->prepare("SELECT id, points FROM users GROUP BY points ORDER BY points DESC");
$query->execute();
foreach($query as $result){
$rank += 1;
if($result['id'] == $_SESSION['myid']){
echo '' . $_SESSION['myuser'] . ' is rank ' . number_format($rank) . ' globally.';
}
}
points
とid
が
この
をインデックス化しているが、私は思いよりもかなりゆっくりと、本当に「ゆっくりではあるが遅くないロードするように見えました私はそれを使っていくつかのテストを行い、次のメソッドを使用して実行するスクリプトの長さを確認することにしました:<?php
$starttime = microtime(true);
session_start();
$rank = 0;
$query = $conn->prepare("SELECT id, points FROM users GROUP BY points ORDER BY points DESC");
$query->execute();
foreach($query as $result){
$rank += 1;
if($result['id'] == $_SESSION['myid']){
echo '' . $_SESSION['myuser'] . ' is rank ' . number_format($rank) . ' globally.';
}
}
$endtime = microtime(true);
$duration = $endtime - $starttime;
echo '<br /><br />This page took ' . $duration . ' seconds to load.';
これは、平均負荷が1.9468239237で、負荷が1000に基づいています。
それは多分それは、処理時間を短縮するが、無駄にだろうと考え、あなたのランクを見つけたときに私は、ループ内でbreak;
を追加しました。
私の質問は、このような何かを計算する良い方法はありますか?
あなたは、インデックスが実際に使用されているかどうかを確認するために、あなたのクエリにEXPLAINをやっていますか?あなたはすべてを取得したい場合は、 '場合($結果[ 'ID'] == $ _SESSION [ 'MYID']){'クエリがランダムな返しに、後で比較するために、 'id'をpoints' BY' GROUPを行うべきではありません –
'id' http://sqlfiddle.com/#!9/56bc9d/1 – Alex
@ chris85しかし、それは1行だけになるだろう...それはみんなのポイントに基づいて、あなたの数を計算する必要がありますそれ以外の場合は、常にあなたがしていることを返します#1にランクされました。 – SmurfTheSmurf