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

关于数据库索引的一个问题:有复合索引建立于列 a,b,c。那么 where a=1 and b like b% and c=3 命中此索引吗? where a=1 and b > 2 and c=3 命中此索引吗?

  •  
  •   BraveXaiver · 7 天前 · 949 次点击
    主要是 C 列还是否能使用此索引?
    谢谢。
    7 条回复    2025-06-10 16:30:28 +08:00
    sagaxu
        1
    sagaxu  
       7 天前
    都能利用(a,b,c)中的前缀(a,b),如果(a,b)值分布很稀疏,是可以命中索引的,如果(a,b)很稠密,可能会走全表扫描,或者使用 c 索引(如果 C 是稀疏的,且建立了 c 索引或者(c,...)复合索引)。
    Rickkkkkkk
        2
    Rickkkkkkk  
       6 天前   ❤️ 1
    两个例子都只能命中 a,b ,命中不了 c
    summerwar
        3
    summerwar  
       6 天前
    建议把索引建立为 a c b 的联合索引,至于有没有命中索引,你直接 EXPLAIN 分析下就能看到。

    sql 不熟,但是大体的意思是 and 会被优化成并列的,所以实际的搜索语句是 a=1 c=3 b like b%,所以为了能够用上所有索引字段,建议你把 c 放到 b 前面
    BraveXaiver
        4
    BraveXaiver  
    OP
       6 天前
    @Rickkkkkkk 我也是这么想的 但在一篇文章里看到前者可以后者不可以 所以才提这个帖子
    kg2019
        5
    kg2019  
       6 天前
    索引下推,Explain 看一下是不是 Using index condition
    chanchan
        6
    chanchan  
       6 天前
    一般匹配到索引返回多维数据为止
    bbsingao
        7
    bbsingao  
       6 天前
    查询 1:WHERE a=1 AND b LIKE 'b%' AND c=3

    完全命中复合索引 (a, b, c),因为所有条件 (= 和前缀 LIKE) 按索引列顺序使用,且操作类型索引友好。

    查询 2:WHERE a=1 AND b > 2 AND c=3

    部分命中复合索引 (a, b, c),通常只利用到 (a, b) 部分,因为 b > 2 是范围查询,可能中断索引后续列 (c) 的使用。

    话说现在这种问题都没必要论坛提问了,AI 都是最顶级的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3109 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 11:37 · PVG 19:37 · LAX 04:37 · JFK 07:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.