根据单独表

时间:2015-04-23 13:00:41

标签: mysql mysqli

糟糕的头衔,抱歉无法简明扼要地阐述这个问题。

  • 我有一个MySQL表(表名:用户),其中包含2m +用户(行)。每个人都有该用户的分数。 (列:用户ID,名称,分数)
  • 我需要申请'兴趣'对每个用户而言,我创造了一个“兴趣”。带列的表(列:用户ID,兴趣)。每次将兴趣分配给用户时,都会创建一个新行。
  • 然后我需要选择50个他们感兴趣的用户='冲浪'他们的分数在10,000到50,000之间

可能有500,000名用户获得该范围内的分数。

我的查询:

SELECT
  a.userid,
  a.interest,
  b.name,
  b.score
FROM interests AS a LEFT JOIN (SELECT
                                 userid,
                                 name,
                                 score
                               FROM users
                               WHERE score > 10000 AND score < 50000) AS b ON a.userid = b.userid
WHERE a.interest = 'surfing'
ORDER BY b.score DESC
LIMIT 50

所以我认为我的上述查询会有效,但我不确定我是否会以有效的方式解决这个问题。我的理解是,它基本上选择所有兴趣行,其中兴趣=冲浪&#39; (这可能是50,000行)然后在用户表上执行JOIN,它本身可能返回500,000行。

我猜这里错过了一个基本概念/方法。希望它对某些人来说显而易见。我很感激帮助,干杯!

2 个答案:

答案 0 :(得分:1)

您可能不需要派生的派生查询,并按

进行操作
select
a.userid,
a.interest,
b.name,
b.score
from interests a 
LEFT JOIN users b on b.userid = a.userid
where 
b.score > 10000 AND b.score < 50000
and a.interest = 'surfing'
ORDER BY b.score DESC
LIMIT 50

添加一些索引会使它更快,如果userid是用户表的主键,那么你不需要在同一个表上重新索引它。

alter table interests add index user_inter_idx(interest,userid);
alter table users add index user_score_idx(score);
  

注意:确保在申请之前备份表格   他们的索引。

您还可以使用

检查查询运行状况

explain select ...

这将让您了解优化程序如何处理查询。

答案 1 :(得分:0)

select 
  i.userid, 
  i.interest, 
  u.name, 
  u.score 
from 
  interests i    

  inner join users u on 
    i.userid = u.userid 
where 
  u.score between 1000 and 50000 and 
  i.interest = 'surfing' 
order by 
  u.score desc 
limit 50

请记住添加以下索引:

  1. 利益:用户ID,兴趣
  2. 用户:userid,得分