我有这个有 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 很陌生。
任何人的建议,欢迎所有反馈:)