对于稍微复杂的查询,怎么判断要对哪些字段加索引呢

2021-09-05 20:39:15 +08:00
 zxCoder

比如我有一个查询,包括一个子查询,这个子查询有四个 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;
1765 次点击
所在节点    PostgreSQL
7 条回复
xuanbg
2021-09-06 06:20:35 +08:00
学会看执行计划
NowTime
2021-09-06 09:32:02 +08:00
来自小米 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 语句并用连接条件对数据进行过滤。
guanguans
2021-09-06 17:34:51 +08:00
同小米的 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
NowTime
2021-09-06 20:08:58 +08:00
@guanguans 惊现 dalao,上周我还看过你这俩项目
guanguans
2021-09-07 10:15:47 +08:00
@NowTime 😄 我关注了你的 github 。
NowTime
2021-09-08 09:11:38 +08:00
@guanguans 我也关注了😄
lolizeppelin
2021-09-16 19:16:50 +08:00
postgresql 的优化给个只支持 mysql 的工具

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/800002

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX