我有一个包含用户信息的用户表和一个相关表,它将向当前用户显示相关用户。
要让相关用户获得用户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_id
和secondary_id
答案 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上需要一个。