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 · 256 天前 · 1431 次点击
    这是一个创建于 256 天前的主题,其中的信息可能已经有所发展或是发生改变。

    腾讯云最新优惠活动来了:云产品限时1折,云服务器低至88元/年 ,点击这里立即抢购:9i0i.cn/qcloud,更有2860元代金券免费领取,付款直接抵现金用,点击这里立即领取:9i0i.cn/qcloudquan

    (福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

    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
       256 天前
    一直对 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  
       256 天前
    应该是 a>=1,b= 2 中的,a=1,b=2 这种会走索引吧,之前研究过,现在忘了,哈哈
    xiangyuecn
        3
    xiangyuecn  
       256 天前
    这种半桶水文章看多了影响智商。直接撸 mysql 官方文档吧。
    asmile1993
        4
    asmile1993  
       256 天前
    从哪本书截的图?看这文字描述,我觉得这本书质量不是很高。

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

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

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


    http://www.vxiaotou.com