V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zxCoder
V2EX  ›  PostgreSQL

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

  •  
  •   zxCoder · 2021-09-05 20:39:15 +08:00 · 1910 次点击
    这是一个创建于 1194 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如我有一个查询,包括一个子查询,这个子查询有四个 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;
    
    7 条回复    2021-09-16 19:16:50 +08:00
    xuanbg
        1
    xuanbg  
       2021-09-06 06:20:35 +08:00
    学会看执行计划
    NowTime
        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 语句并用连接条件对数据进行过滤。
    guanguans
        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
    NowTime
        4
    NowTime  
       2021-09-06 20:08:58 +08:00
    @guanguans 惊现 dalao,上周我还看过你这俩项目
    guanguans
        5
    guanguans  
       2021-09-07 10:15:47 +08:00
    @NowTime 😄 我关注了你的 github 。
    NowTime
        6
    NowTime  
       2021-09-08 09:11:38 +08:00
    @guanguans 我也关注了😄
    lolizeppelin
        7
    lolizeppelin  
       2021-09-16 19:16:50 +08:00
    postgresql 的优化给个只支持 mysql 的工具
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2771 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 13:20 · PVG 21:20 · LAX 05:20 · JFK 08:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.