优化相关表查询

时间:2013-03-27 07:13:47

标签: mysql query-optimization

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

要让相关用户获得用户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条记录和629241表格中的users

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

和索引定义为primary_idsecondary_id

的组合

1 个答案:

答案 0 :(得分:1)

  

它已经为600万条记录完成了所以我无法改变它

成长一对Hardcore - 你已经在表中获得了相对较小的数据量,这是没有理由不修复糟糕的设计。

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

为什么使用子查询而不是仅仅加入表?再次开始为您提供可以开始优化的内容:

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的组合

为什么呢?它对这个查询没什么帮助 - 你需要在primary_id上有2个索引,在secondary_id上需要一个。