比如我有一个查询,包括一个子查询,这个子查询有四个 and 的 where 条件,我就给这四个属性加了一个联合索引,
然后 where 之后还对 userId 进行分组求 MIN(某个属性),然后外层查询就有一个某个属性 IN 这个子查询的结果, 这里的操作我还需要用到什么索引吗?
最后我还需要对这个结果进行排序,按某个字段排序,这里加索引还有用吗?
大概是这样子的,( sql 不太熟悉,写的这个可能有错
items(userId,value,a,b,c,d,e)
SELECT * FROM items WHERE value IN
(
SELECT MIN(value) WHERE a=1 AND b=2 AND c=3 AND d=4 GROUP BY userId
)
ORDER BY e;
1
xuanbg 2021-09-06 06:20:35 +08:00
学会看执行计划
|
2
NowTime 2021-09-06 09:32:02 +08:00 1
来自小米 SOAR 工具的分析,连接上数据库分析更准确
![iShot2021-09-06 09.29.52.jpg]( https://i.loli.net/2021/09/06/cxMGuC3hsnyA8i9.jpg) 请为 GROUP BY 显示添加 ORDER BY 条件 Content: 默认 MySQL 会对 'GROUP BY col1, col2, …' 请求按如下顺序排序 'ORDER BY col1, col2, …'。如果 GROUP BY 语句不指定 ORDER BY 条件会导致无谓的排序产生,如果不需要排序建议添加 'ORDER BY NULL'。 MySQL 对子查询的优化效果不佳 Content: MySQL 将外部查询中的每一行作为依赖子查询执行子查询。 这是导致严重性能问题的常见原因。这可能会在 MySQL 5.6 版本中得到改善, 但对于 5.1 及更早版本, 建议将该类查询分别重写为 JOIN 或 LEFT OUTER JOIN 。 不建议在子查询中使用函数 MySQL 将外部查询中的每一行作为依赖子查询执行子查询,如果在子查询中使用函数,即使是 semi-join 也很难进行高效的查询。可以将子查询重写为 OUTER JOIN 语句并用连接条件对数据进行过滤。 |
3
guanguans 2021-09-06 17:34:51 +08:00 2
同小米的 SOAR 工具,连接上数据库后分析,会给出字段加索引建议。
推荐两个包: https://github.com/guanguans/soar-php https://github.com/guanguans/laravel-soar https://raw.githubusercontent.com/guanguans/laravel-soar/master/docs/low-score.png |
7
lolizeppelin 2021-09-16 19:16:50 +08:00
postgresql 的优化给个只支持 mysql 的工具
|