2013-03-27 94 views
0

我有一个包含用户信息和相关表的用户表,它将向当前用户显示相关用户。优化关联表查询

要获得相关用户到用户ID“25”我的查询看起来像

SELECT 
    id 
FROM users u 
    INNER JOIN (SELECT 
       primary_id, 
       secondary_id 
       FROM users_rel 
       WHERE primary_id = '25' 
        OR secondary_id = '25') temp 
    ON (u.id = temp.primary_id 
     OR u.id = temp.secondary_id) 
WHERE u.id != '25' 

这里的问题是,在users_rel表中的用户ID可以是在初级侧或次级侧。不要告诉我改变它,因为它已经完成了600万条记录,所以我不能改变它。这个查询需要2到5分钟以4000记录在user_rel表中执行,629241users表中执行。

user_rel TABLE 
.--------------------------------. 
| id   | (VARCHAR,36) | 
| primary_id | (VARCHAR,36) | 
| secondary_id | (VARCHAR,36) | 
| del  | (TINYINT,1) | 
|.______________________________.| 

和索引定义为primary_id组合secondary_id

+0

你可以发布'users_rel'的模式是如何设计的吗?是声明为外键的两列还是它们有任何索引定义? – 2013-03-27 07:32:32

+0

你可以使用'25 IN(\'primary_id \',\'secondary_id \')' – hjpotter92 2013-03-27 07:35:21

回答

1

其已经完成了6万条记录,所以我不能改变它

长出了一对性交 - 你”我已经得到了一个相对较小的表中的数据量没有理由不修复坏的设计。

如果您发布了表和解释计划的确切结构(即创建表语句),这将有所帮助。

为什么你使用子查询而不是加入表?再次开始给你的东西,你可以开始优化:

SELECT u.id 
FROM users u 
INNER JOIN users_rel r 
    ON 25 in (primary_id, secondary_id) 
    AND (u.id = r.primary_id 
     OR u.id=r.secondary_id) 
WHERE u.id != '25'; 

这应该会给出相同的结果。是否更快......我们不知道。

指数被定义为primary_id的组合和secondary_id

为什么呢?对于这个查询不会有太大的帮助 - 你需要在secondary_id上的primary_id上有两个索引。