首页 > 解决方案 > 如何优化 SQL 查询?

问题描述

SELECT *
FROM account a1 
LEFT JOIN account a2 ON a1.group_id>0 AND a2.app_id=0 AND a1.group_id=a2.group_id AND a1.id!=a2.id 
JOIN user_account_ref uar ON uar.account_id=a1.id OR (uar.account_id=a2.id AND uar.role>0) 
WHERE uar.user_id IN ($some_user_ids);

当我将 where 子句替换为 时WHERE a1.id IN ($some_account_ids),查询速度很快,但在用户 ID 中查询却很慢。我尝试使用子查询,但无法使其工作。

表架构如下:

---account---
id
app_id
group_id

---user_account_ref---
id
user_id
account_id
role

更多信息:

select * from user_account_ref where user_id IN (xxx)

速度很快,结果有 4 行。

SELECT * 
FROM account a1 
LEFT JOIN account a2 ON a1.group_id>0 AND a2.app_id=0 AND a1.group_id=a2.group_id AND a1.id!=a2.id

速度也很快,结果有 2000 多行。

标签: mysqlsqlsql-optimization

解决方案


请尝试这三个索引,看看它们是否能解决您的性能问题。(然后查看解释计划,看看哪些索引没有被使用并删除它们。)

create index idx1 on account (group_id, id, app_id);
create index idx2 on user_account_ref (user_id, account_id);
create index idx3 on user_account_ref (account_id, user_id);

idx1是为了加快你的account自我加入。idx2并且idx3是对 DBMS 快速加入user_account_ref表的两个提议。希望 DBMS 能够选择其中之一,从而更快地执行查询。

如果这些索引没有帮助,您可以尝试仅idx3先删除,以产生一种力量idx2,因为用户的条件似乎大大减少了要查看的行,而 DBMS 可能没有意识到这一点。

最后,您可能能够更新 MySQL 的表统计信息,因此 DBMS 更了解您的表。祝你好运。


推荐阅读