【发布时间】:2013-05-16 10:49:50
【问题描述】:
我有这张表 (PERSONS) 有 2500 万行:
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 秒)。但这些行实际上只是随机的(自points > 0 起至少有 1 个点)。我想显示一些有点接近的行,不必每次都如此,但假设我使用限制 50 执行此查询,然后在 PHP 中选择一个随机行和 3 个最接近的行(基于点) 在它的旁边。我认为您需要对结果进行排序,选择一个随机行并显示它之后/之前的行。但我不知道如何做到这一点,因为我对 PHP 很陌生。
任何人的建议,欢迎所有反馈:)
【问题讨论】:
-
查询从 0.05 秒到 2.6213 秒
-
那是优化你的表的问题,你有关于点的索引吗?
-
是的,上面有索引
-
子选择总是有问题的。在大多数情况下,优化器必须为主选择中的每一行运行子选择......这非常糟糕。我会做两个单独的查询。应该快得多。另一方面,您可以直接将子选择作为一列(如果它只返回一列)而不进行连接。如果您仍想将其作为子选择,这也应该会提高性能。
-
To-Be 是什么意思,能解释一下吗?
标签: php mysql sql sorting random