有关 MySQL InnoDB 在索引中自动添加主键的问题

只要用户定义的索引字段中包含了主键中的字段、那么这个字段就不会再被InnoDB自动加到索引中。但如果用户的索引字段中没有完全包

 ㈠ 原理:

只要用户定义的索引字段中包含了主键中的字段、那么这个字段就不会再被InnoDB自动加到索引中

但如果用户的索引字段中没有完全包含主键字段、InnoDB 就会把剩下的主键字段加到索引末尾

㈡ 例子

例子一:

CREATE TABLE t (
  a char(32) not null primary key,
  b char(32) not null,
  KEY idx1 (a,b),
  KEY idx2 (b,a)
) Engine=InnoDB;

idx1 和 idx2 两个索引内部大小完全一样、没有区别

例子二:

CREATE TABLE t (
  a char(32) not null,
  b char(32) not null,
  c char(32) not null,
  d char(32) not null,
  PRIMARY KEY (a,b)
  KEY idx1 (c,a),
  KEY idx2 (d,b)
) Engine=InnoDB;

这个表 InnoDB 会自动补全主键字典、idx1 实际上内部存储为 (c,a,b),idx2 实际上内部存储为 (d,b,a)

但是这个自动添加的字段、Server 层是不知道的、所以 MySQL 优化器并不知道这个字段的存在、那么如果你有一个查询:

  SELECT * FROM t WHERE d=x1 AND b=x2 ORDER BY a;

其实内部存储的 idx2(d,b,a) 可以让这个查询完全走索引、但是由于 Server 层不知道、

所以最终 MySQL优化器 可能选择 idx2(d,b) 做过滤然后排序 a 字段、或者直接用PK扫描避免排序

而如果我们定义表结构的时候就定义为 KEY idx2(d,b,a) 、那么 MySQL 就知道(d,b,a)三个字段索引中都有、

并且 InnoDB 发现用户定义的索引中包含了所有的主键字段、也不会再添加了、并没有增加存储空间

㈢ 建议

因此、由衷的建议、所有的 MySQL DBA 建索引的时候、都在业务要求的索引字段后面补上主键字段、

这没有任何损失、但是可能给你带来意外的惊喜哦

linux

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/1892345.html

(0)
上一篇 2025年2月22日 13:22:34
下一篇 2025年2月22日 13:22:52

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • MySQL索引之哈希索引

    下面着力讲解建立自己的MySQL哈希索引,想法非常简单,在标准的B-Tree索引上创建一个伪哈希索引。它和真正的哈希索引不是一回事, 哈希索引(Hash Index)建立在哈希表的基础上,它只对使用了索引中的每一列的精确查找有用。对于每一行…

    数据库 2025年2月22日
    100
  • MySQL索引之前缀索引和索引选择性

    通常可以索引开始的几个字符,而不是全部值,以节约空间并得到好的性能。这使索引需要的空间变小,但是也会降低选择性。索引选择 有时需要索引很长的字符列,它会使索引变大而且变慢。一个策略就是模拟哈希索引。但是有时这也不够好,那? 通常可以索引开始…

    数据库 2025年2月22日
    100
  • MySQL在有索引列情况下select *的输出结果顺序

    创建一个表格,一个是主键列,一个是索引列。然后插入一批数据,调用select * from test_b,可以发现输出结果并没有按照Id有序, 创建一个表格,一个是主键列,一个是索引列。然后插入一批数据,调用select * from te…

    数据库 2025年2月22日
    100
  • MySQL查询不使用索引汇总

    众所周知,增加索引是提高查询速度的有效途径,但是很多时候,即使增加了索引,查询仍然不使用索引,这种情况严重影响性能,这里 众所周知,增加索引是提高查询速度的有效途径,但是很多时候,即使增加了索引,查询仍然不使用索引,这种情况严重影响性能,这…

    数据库 2025年2月22日
    100
  • MySQL中B+树索引的管理

    目前mysql数据库存在的一个普遍的问题是,所有对于索引的添加或者删除操作,mysql数据库是先创建一张新的临时表,然后把数据导入 索引的创建和删除可以通过两种方法;一种是alter table ,另一种是create /drop inde…

    数据库 2025年2月22日
    100
  • MySQL InnoDB存储引擎锁机制实验

    之前的文章提到MySQL的InnoDB存储引擎使用的是行级锁,并且默认的事务隔离级别为可重复读,而不同于Oracle默认的事务隔离级别提交 之前的文章提到mysql的innodb存储引擎使用的是行级锁,并且默认的事务隔离级别为可重复读,而不…

    数据库 2025年2月22日
    100
  • MySQL前缀索引导致的慢查询

    前端时间跟一个DB相关的项目,alanc反馈有一个查询,使用索引比不使用索引慢很多倍,有点毁三观。所以跟进了一下,用explain,看 前端时间跟一个db相关的项目,alanc反馈有一个查询,使用索引比不使用索引慢很多倍,有点毁三观。所以跟…

    数据库 2025年2月22日
    200
  • MySQL Innodb独立表空间的配置

    mysql innodb的独立表空间和共享表空间,独立表空间是把每个表的数据和表文件放在一起。共享表空间是所有库的数据都放在ibdate1文 没经验真可怕 项目是去年9月份开始运行的,现在数据库中的那些统计表非常庞大,并且时不时领导要你在这…

    数据库 2025年2月22日
    200
  • Linux UDEV和为MySQL InnoDB共享表空间配置裸设备

    udev 可管理保存在/dev 目录下的文件、文件只有在接入相应设备后才会生成、设备被拔出后自动删除,它还允许用户添加规则、以便修 ⑴ udev 基础 udev 可管理保存在/dev 目录下的文件、文件只有在接入相应设备后才会生成、设备被拔…

    数据库 2025年2月22日
    200
  • MySQL索引学习笔记

    两个索引都是B+树索引,但是myisam的表存储和索引存储是分开的,索引存储中存放的是表的地址。而innodb表存储本身就是一个B+树, myisam和innodb的索引有什么区别? 两个索引都是B+树索引,但是myisam的表存储和索引存…

    数据库 2025年2月22日
    200

发表回复

登录后才能评论