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_rel629241users

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

和索引被定义为primary_id和的组合secondary_id

4

1 回答 1

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

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

于 2013-03-27T09:24:08.647 回答