V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
cnoder
V2EX  ›  程序员

这种索引真的能用吗

  •  
  •   cnoder · 2022-08-08 21:11:07 +08:00 · 1646 次点击
    这是一个创建于 867 天前的主题,其中的信息可能已经有所发展或是发生改变。

    今天看到一张表

    CREATE TABLE `data` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
      `xx_id` varchar(128) NOT NULL,
       ··· 一些普通字段
      PRIMARY KEY (`id`,`create_time`) USING BTREE,
      KEY `Index_xx_id` (`xx_id`) USING BTREE
    ) ENGINE=InnoDB AUTO_INCREMENT=320 DEFAULT CHARSET=utf8
    /*!50500 PARTITION BY RANGE  COLUMNS(create_time)
    (PARTITION p202206 VALUES LESS THAN ('2022-07-01') ENGINE = InnoDB,
     PARTITION p202207 VALUES LESS THAN ('2022-08-01') ENGINE = InnoDB,
    

    我 explain 了一下

    1. 仅使用 create_time range 查询 的时候不会命中索引
    2. 使用 xx_id=x 和 create_time range 的时候命中 xx_id 索引,理论上回表是能找到主键

    理论上如果仅有 2 的情况下这表也不是不能用,他把 create_time 加到主键联合索引主要还是为了分区

    3 条回复    2022-08-09 10:50:03 +08:00
    rekulas
        1
    rekulas  
       2022-08-08 21:26:59 +08:00
    看起来是没什么用
    nothingistrue
        2
    nothingistrue  
       2022-08-09 09:44:20 +08:00
    xx_id 这个索引是有效的,能不能用取决于业务上这个 xx_id 是否是检索条件。

    为了分区把 create_time 加到主键之后,这个主键基本上是废了,既不是自然键也不是代理键,很难用。
    lieyan
        3
    lieyan  
       2022-08-09 10:50:03 +08:00
    为什么不使用联合索引,而把 create_time 加入主键?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5408 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 01:33 · PVG 09:33 · LAX 17:33 · JFK 20:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.