25M 行のこのテーブル ( PERSONS ) があります。
ID int(10) PK
points int(6) INDEX
some other columns
ユーザーに、互いにポイントがやや近い4つのランダムな行を表示したいと思います。ランダムな行を生成するためにいくつかの検索と調整を行った後、このクエリを見つけました。これは非常に高速です。
SELECT person_id, points
FROM persons AS r1 JOIN
(SELECT (RAND() *
(SELECT MAX(person_id)
FROM persons)) AS id)
AS r2
WHERE r1.person_id>= r2.id and points > 0
ORDER BY r1.person_id ASC
LIMIT 4
だから私はPHPでこれを照会します。これにより、素晴らしく高速な結果が得られます (ウォームアップ時は 0.05 秒未満)。しかし、これらの行は実際にはランダムです (少なくとも 1 点以降points > 0
)。少し近い行をいくつか表示したいと思いますが、毎回である必要はありませんが、このクエリを制限 50 で実行し、PHP でランダムな行を選択し、最も近い 3 つの行 (ポイントに基づく) を選択するとします。 ) その次。結果をソートし、ランダムな行を選択して、その前後の行を表示する必要があると思います。しかし、私はPHPにまったく慣れていないため、これをどのように作成できるかわかりません。
誰でも提案、すべてのフィードバックを歓迎します:)