0

我的任务是与我当地的社区中心一起在情人节及时制作一个“新婚”类型的游戏,所以不要着急!

所以,我们有 50 对非常了解彼此的夫妇将提前被问到 100 个问题。每个问题都有用户的回答和允许误差范围的范围(此范围配额将受到限制)。然后他们可以选择他们认为合作伙伴的答案,误差范围相同。

EG(我会像我和我的GF一样打一轮):

问:你喜欢吃水果吗?我对水果很挑剔,所以我会在 100 分中打出低分……比如 20 'LL允许将是30岁。我认为她喜欢水果,至少会放90个..但是她喜欢很多食物,所以可以将其排名较低,所以我给她20的利润率为20。

好的,对 100 个问题和 50 对重复该过程。

我剩下一张这样的桌子:

u_a = 用户回答

u_l = 用户误差水平

p_a = 合作伙伴答案

p_l = 合作伙伴误差水平

CREATE TABLE IF NOT EXISTS `large` (
`id_user` int(11) NOT NULL,
`id_q` int(11) NOT NULL,
`u_a` int(11) NOT NULL,
`u_l` int(11) NOT NULL,
`p_a` int(11) NOT NULL,
`p_l` int(11) NOT NULL,
KEY `id_user` (`id_user`,`id_q`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Stackoverflow Test';

所以我的行将在前面的示例中:

(1, 1, 20, 30, 90, 20)

我的任务是搜索所有用户,看看谁是 50 人中最匹配的人。(并希望夫妻相处得很好!)。

我想在数据库中搜索我对合作伙伴的答案与他们的答案相匹配的所有用户,但对于每个用户。

这是我到目前为止所得到的(注意我已经注释掉了一些代码,那是因为我正在尝试两种方法,不确定什么是最好的):

SELECT
match.id_user,
count(*) as count
from `large` `match`
INNER JOIN `large` `me` ON me.id_q = match.id_q
WHERE
me.id_user = 1 AND
match.id_user != 1 AND
GREATEST(abs(me.p_a - match.u_a), 0) <= me.p_l
AND
GREATEST(abs(match.p_a - me.u_a), 0) <= match.p_l 

#match.u_a BETWEEN GREATEST(me.p_a - me.p_l, 0) AND (me.p_a + me.p_l)
#AND
#me.u_a BETWEEN GREATEST(match.p_a - match.p_l, 0) AND (match.p_a + match.p_l)

GROUP BY match.id_user

ORDER BY count DESC

我今天的问题是:

此查询需要 AGES!我想在游戏期间这样做,让用户有机会在晚上更改答案并获得即时结果,所以这必须很快。为我(用户 1)查找所有匹配项时,我正在查看 40 秒。

我现在正在阅读有关数据库引擎和索引的信息,以确保我正在尽我所能......但欢迎提出建议!

干杯和呸!

4

1 回答 1

0

您的查询不应该在小型数据集上花费 40 秒。知道发生了什么的最好方法是explain在查询之前使用。

但是,我怀疑问题出在me. MySQL 引擎可能会为所有用户创建所有可能的组合,然后将您过滤掉。您可以通过修改以下代码来测试:

from `large` `match` INNER JOIN
     `large` `me`
     ON me.id_q = match.id_q
WHERE me.id_user = 1 AND
      match.id_user != 1 AND . . . .

至:

from `large` `match` INNER JOIN
     (select me.*
      from `large` `me`
      where me.id_user = 1
     ) me
     ON me.id_q = match.id_q
WHERE match.id_user != 1 AND . . . .

此外,以下索引可能有助于查询: large(id_user, id_q)large(id_q).

于 2013-07-21T14:47:23.660 回答