mysql - 如何优化 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 多行。
解决方案
请尝试这三个索引,看看它们是否能解决您的性能问题。(然后查看解释计划,看看哪些索引没有被使用并删除它们。)
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 更了解您的表。祝你好运。
推荐阅读
- php - PHP 工作但 Laravel 不工作,返回 503 Service Unavailable
- android-studio - 在 AndoidStudio 项目和 IntelliJ 项目之间共享代码的概念方法
- jmeter - Jmeter模拟用户发送多个HTTP请求
- python - python请求验证SSL证书
- power-automate - 如果 Excel“获取行”返回 404 Not Found,则流标记为失败
- spring-boot - 如何在 Spring Boot 微服务架构中使用 Keycloak 实现 JWT?
- android-layout - 为什么文字没有出来?
- c# - 是否可以在 Unity HoloLens 应用程序真实世界中生成自己的 Windows10 窗口
- python - 有没有办法从包装器中获取与 WindowsSpecification 对象相同的信息?
- python - 如何在 Python 字典中合并数据