V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
rqxiao
V2EX  ›  MySQL

为什么 mysql 在联合索引中,出现范围查询(<, >),范围查询右侧的列索引失效。可以用>=或者<=来规避索引失效问题。

  •  
  •   rqxiao · 248 天前 · 1406 次点击
    这是一个创建于 248 天前的主题,其中的信息可能已经有所发展或是发生改变。

    img

    按照这个说法 如果 a 的值有 1-99 , 在 a>=1 条件下,只有 a=1 用到 ab 联合索引,2 到 99 只用到了 a 列的索引?

    5 条回复    2023-08-26 17:26:41 +08:00
    rqxiao
        1
    rqxiao  
    OP
       248 天前
    一直对 mysql 在联合索引中>=或者<=来规避索引失效这个不是很理解。



    范围查询右边失效原理 如果是 ><的情况,可以按照下面这种解释,
    举例
    select * from t where a>1 and b=2
    分析如下:

    首先 a 字段在 B+树上是有序的,所以可以用二分查找法定位到 1 ,然后将所有大于 1 的数据取出来,a 可以用到索引。

    b 有序的前提是 a 是确定的值,那么现在 a 的值是取大于 1 的,可能有 10 个大于 1 的 a ,也可能有一百个 a 。

    大于 1 的 a 那部分的 B+树里,b 字段是无序的(开局一张图),所以 b 不能在无序的 B+树里用二分查找来查询,b 用不到索引。

    那为什么>= 就可以用到 a 和 b 列索引了呢
    wmz000
        2
    wmz000  
       248 天前
    应该是 a>=1,b= 2 中的,a=1,b=2 这种会走索引吧,之前研究过,现在忘了,哈哈
    xiangyuecn
        3
    xiangyuecn  
       248 天前
    这种半桶水文章看多了影响智商。直接撸 mysql 官方文档吧。
    asmile1993
        4
    asmile1993  
       248 天前
    从哪本书截的图?看这文字描述,我觉得这本书质量不是很高。

    1) 假设 Q2 能利用上索引 (a, b),那么由于 a 是范围查询,根据高性能 MySQL 中的知识,可以知道“如果查询中有某个列的范围查询,则其右边所有列都无法使用索引优化查找”, 这里说的无法使用索引优化查找,是指“不能用索引快速定位”,但"快速过滤"是可以做的。

    2) 由 1 可知,索引(a, b) 中,只有列 a 能用作索引快速定位,而列 b 不能用来快速定位,但 MySQL 有索引下推优化,因此对于列 b 来说,可以利用 ICP 来达到在索引遍历中快速过滤,从而减少回表次数。

    有点没看懂你这个例子的回答,一直说索引有序是什么意思,虽然有关系,但有点答不对题,让人疑惑。
    54qyc
        5
    54qyc  
       245 天前
    OP 可以给个链接吗?图中信息太少了,猜测表达的意思是利用 a = 1 , b = 2 查询到了第一条记录,然后开始往后扫描索引。此时无法直接二分查找了,扫描到的记录发给服务器做 where 过滤。这问题的表述你看是人话吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2828 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 12:21 · PVG 20:21 · LAX 05:21 · JFK 08:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.