`
sjk2013
  • 浏览: 2187579 次
文章分类
社区版块
存档分类
最新评论

有关 MySQL 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 建索引的时候、都在业务要求的索引字段后面补上主键字段、
这没有任何损失、但是可能给你带来意外的惊喜哦

分享到:
评论

相关推荐

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

     只要用户定义的索引字段中包含了主键中的字段,那么这个字段不会再被InnoDB自动加到索引中。但如果用户的索引字段中没有完全包含主键字段,InnoDB会把剩下的主键字段加到索引末尾。  (二)例子  例子一: ...

    MySQL 主键与索引的联系与区别分析

    所谓主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引。因为主键可以唯一标识某一行记录,所以可以确保执行数据更新、删除的时候不会出现张冠李戴的错误。主键除了上述...

    MySQL索引之主键索引

    在MySQL中,InnoDB数据表的主键设计我们通常遵循几个原则: 1、采用一个没有业务用途的自增属性列作为主键; 2、主键字段值总是不更新,只有新增或者删除两种操作; 3、不选择会动态更新的类型,比如当前时间戳等。 ...

    Mysql innodb 存储引擎全揭秘

    Innodb 通过多版本并发控制(MVCC)来获得高并发...对于表中的数据innodb 采用聚集的方式,每张表的存储都是按主键的顺序存放,如果没有显式在表定义时指定主键,innodb 会为每一行生成一个6字节的rowid,并以此为主键。

    深入讲解MySQL Innodb索引的原理

    引言 回想四年前,我在学习mysql的索引这块的时候,...需要说明的是,我说的内容只在Mysql的Innodb引擎中是成立的。在Sql Server、oracle、Mysql的Mysiam引擎中的正确性,不一定成立! InnoDB是 MySQL最常用的存储引擎

    详解MySQL InnoDB的索引扩展

    索引扩展,InnoDB通过将主键列附加到每个辅助索引中来自动扩展该索引。创建如下表结构: mysql> CREATE TABLE t1 ( -> i1 INT NOT NULL DEFAULT 0, -> i2 INT NOT NULL DEFAULT 0, -> d DATE DEFAULT NULL, -> ...

    关于MySQL面试题中有关索引的九大难点全在这里了

    o聚集索引:聚集索引就是以主键创建的索引,在叶子节点存储的是表中的数据。 o非聚集索引:非聚集索引就是以非主键创建的索引,在叶子节点存储的是主键和索引列。 逻辑维度 o主键索引:一种特殊的唯一索引,不允许有...

    【MySQL】经验:索引使用场景

    InnoDB中会自动为主键建立聚集索引,即使没有定义主键,也会自动生成一个隐藏主键建立索引;MyISAM中不会自动生成主键。建议给每张表指定主键。 2、频繁作为查询条件的字段 索引是以空间换时间的,某字段如果频繁...

    为什么说InnoDB必须要有主键并且推荐使用自增整型主键呢?

    1.InnoDB存储引擎的数据结构必须需要一个主键才可以组织起来,如果用户使用InnoDB存储引擎建立表的时候,没有指定主键,则Mysql会自动的帮你找到一个合适的唯一索引作为主键,若找不到符合条件唯一索引条件的字段时...

    MySQL中主键索引与聚焦索引之概念的学习教程

    在MySQL中,InnoDB数据表的主键设计我们通常遵循几个原则: 采用一个没有业务用途的自增属性列作为主键; 主键字段值总是不更新,只有新增或者删除两种操作; 不选择会动态更新的类型,比如当前时间戳等。 这么做的...

    MySQL学习(七):Innodb存储引擎索引的实现原理详解

    在innodb存储引擎中,主要是基于B+树来实现索引,在非叶子节点存放索引关键字,在叶子节点存放数据记录或者主键索引(或者说是聚簇索引)中的主键值,所有的数据记录都在同一层,叶子节点,即数据记录直接之间通过...

    浅析InnoDB索引结构

    0、导读 InnoDB表的索引有哪些特性,以及索引组织结构是怎样的 1、InnoDB聚集索引特点 ...如果有显式定义的主键(PRIMARY KEY),则会选择该主键作为聚集索引否则,选择第一个所有列都不允许为NULL的唯

    聚簇索引与主键的选择

    在MySql的InnoDB引擎中,表数据的文件是按照B+树组织的一个索引结构。而聚簇索引就是按照每张表的主键构造出来的B+树,叶子节点就是整张表的行数据,所以聚簇索引的叶子节点也被称为数据页。 二、什么是非聚簇索引?...

    MySQL笔记-InnoDB物理及逻辑存储结构

    在InnoDB引擎中,创建表没有主键,InnoDB会把not null中unique作为主键,若这样的列也没有,那么InnoDB会生成6个字节的不可见的rowid。 在InnoDB中如果是独立表空间,创建一个表会生成2个文件,一个是.frm文件,一...

    【数据库】浅析Innodb的聚集索引与非聚集索引

    Mysql存储引擎之一的Innodb的索引,可以分为聚集索引与非聚集索引,这两种索引都是使用B+树组织的。 本文不讲解什么是索引,对索引不了解的同学可以先移步到我的另外一篇文章【数据库】mysql索引简谈 在分析这两种...

    MySQL小面试题!!!!!

    聚簇索引中主键索引和数据在一起,都在叶子节点中,非聚簇索引中,索引和数据是分开的。 建立在主键上的是主键索引。我们自己建的索引基本上都是非聚簇索引。 在非聚簇索引中查询数据,还需要根据主键到聚簇索引中...

    Mysql面试问题加答案50道题.docx

    1. 简述MySQL中的InnoDB和MyISAM存储引擎的区别? InnoDB支持事务,MyISAM不支持。InnoDB支持外键,MyISAM不支持。InnoDB支持行级锁,而MyISAM只支持表级锁。 2. 什么是数据库索引?MySQL中有哪些索引类型? ...

    常见(MySQL)面试题(含答案).docx

    MyisAM和innodb的有关索引的疑问 innodb为什么要用自增id作为主键 MySql索引是如何实现的 说说分库与分表设计(面试过) 聚集索引与非聚集索引的区别 事务四大特性(ACID)原子性、一致性、隔离性、持久性? 事务的...

    MySQL自整理超全精华版面试八股文

    一条SQL语句在ySQL中如何被执行的? 索引 什么是索引 索引的优缺点 MySQL的索引有哪些? B树和B+树有什么异同? MySQL为什么使用B+树而不是B树? 主键索引和辅助索引(二级索引) 聚簇索引和非聚簇索】 非聚簇索引...

    100道mysql的面试题

    MySQL事务得四大特性以及实现原理,如何写sql能够有效的使用到复合索引,数据库自增主键遇到的问题,MVCC,主从同步延迟,为什么需要数据库连接池, InnoDB引擎中的索引策略,Blob和text有什么区别,Mysql中有哪几种...

Global site tag (gtag.js) - Google Analytics