首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

主键索引就是聚集索引MySQL 索引类型大梳理

之前松哥在前面的文章中介绍 MySQL索引时,有小伙伴表示被概念搞晕了,主键索引、非主键索引、聚簇索引、非聚簇索引、二级索引、辅助索引等等,今天咱们就来捋一捋这些概念。 1....(括号外面的索引名,里边的索引的字段)。...MySQL 的全文索引最开始只支持英文,因为英文分词比较方便;中文分词就比较麻烦,所以最早的 MySQL 全文索引不支持中文的。...如果这张表也没有唯一非空索引,那么 InnoDB 内部会生成一个隐藏的主键作为聚集索引,这个隐藏的主键一个 6 个字节的列,该列的值会随着数据的插入自增。...聚集索引在插入的时候,最好主键自增,自增主键插入的时候比较快,直接插入即可,不会涉及到叶子节点分裂等问题(不需要挪动其他记录);而其他非自增主键插入的时候,可能要插入到两个已有的数据中间,就有可能导致叶子节点分裂等问题

2.3K20

主键聚集索引、辅助索引

让人非常遗憾的,网络上至今仍然有非常多的文章这样的描述:“一张表中必须有聚集索引,但不一定需要主键”。前半句正确的,后半句大错特错!...主键聚集索引的关系 先来看聚集索引,上面我们说过,InnoDB 存储引擎表索引组织表结构,即表中数据都是按照主键顺序进行存放的。...一张表只能有一个主键,并且也只能有一个聚集索引聚集索引还是按照主键来构建的,那这种种迹象不都表明主键就是聚集索引? 事实上,主键索引就不是一个层次的东西!...而至于 “主键就是索引” 这种观点的由来,是因为:InnoDB 存储引擎中,每张表都一定存在主键(显示或隐式),而聚集索引依赖于主键的建立,所以如果没有强制指定使用非聚集索引,InnoDB 在创建主键的同时会建立一个唯一的聚集索引...所以,不要说 “主键就是聚集索引”,应该这样说:“聚集索引一般都是加在主键上的”。 聚集索引和辅助索引的关系 辅助索引(Secondary Index)也称为 非聚集索引、二级索引

80410
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Mysql聚集索引和非聚集索引

    首先要明确一个概念,在聚集索引的世界里索引就是数据,在最后的叶子索引键保存着对应的数据行。...* from TestNonclusteredIndex where ID = 3; SQL知道ID聚集索引,因此就去聚集索引里去查找(查找和扫描有区别的),当找到对应的键值的时候里面保存的 "...如果执行这条查询语句: select * from TestNonclusteredIndex where col1 = 6 SQL知道col1上有非聚集索引,去索引里查找,找到的6的非聚集索引键值和这条记录的聚集索引键值...,因为没有数据(3 6),SQL就用这个聚集索引查找,就上面的例子一样就找到(3 6)这条数据; 其次,你要知道聚集索引顺序的,到最后的数据页的时候,你知道第一条记录聚集索引1难道聚集索引为2的记录不是它下一条...,那么聚集索引为N的记录不是1之后的N-1条?

    2.4K50

    MySQL 聚集与非聚集索引

    MySQL 中,根据索引树叶结点存放数据行还是数据行的地址,可以将索引分为两类: 存放数据行:聚集索引 存放数据行地址:非聚集索引 InnoDB 使用聚集索引,MyISAM 使用非聚集索引。...与聚集索引配套使用的二级索引(Secondary Indexes),也叫辅助索引。 一个表可以有多个二级索引。 二级索引树叶子结点存储的主键。...1.2 优点 主键查询效率更高 通过主键使用聚集索引查找数据比非聚集索引要快,因为非聚集索引定位到对应主键时还要多一次目标记录磁盘 IO,即回表查询。...非聚集索引(Nonclustered Index)的索引文件和表数据分开的,主键索引和二级索引存储上没有任何区别。使用 B+ 树存储索引,所有节点都是索引,叶子结点存储的索引+数据地址」。...聚集索引的数据行在物理存储上有序的,对于范围查询和排序操作,有序的物理存储结构也有助于减少磁盘 I/O 操作,提高查询性能。非聚集索引和数据行分开两个文件存放,数据行在物理存储上乱序的。

    84710

    sql server 聚集索引,非聚集索引,Identity ,gudi,主键的概念和比较

    聚集索引和非集聚索引 聚集索引:该索引中键值的逻辑顺序决定了表中相应行的物理顺序。 非聚集索引:该索引索引的逻辑顺序与磁盘上行的物理存储顺序不同。...索引通过二叉树的数据结构来描述的,我们可以这么理解聚集索引索引的叶节点就是数据节点。而非聚集索引的叶节点仍然索引节点,只不过有一个指针指向对应的数据块。...聚集索引图: 叶子节点就是真实的数据节点 非集聚索引图: 叶子节点也是数据节点,该节点存储的真实数据的内存地址。...因为主键默认聚集索引,所以我们再使用guid作为主键的时候数据量比较大的话就有性能问题。...但是如果数据量小就放心的使用吧,但是如果分布式的数据库,又不能用int作为主键怎么办,这个时候我们可以选择两种方式混合用,再自己的数据库用int 这样查询和修改就比较快,同时使用guid作为唯一标识,

    81130

    深入理解四种数据库索引类型(- 唯一索引非唯一索引 - 主键索引(主索引) - 聚集索引聚集索引 - 组合索引)唯一索引非唯一索引主键索引(主索引聚集索引聚集索引5.组合索引(联合索引

    唯一索引/非唯一索引 主键索引(主索引聚集索引/非聚集索引 组合索引 唯一索引/非唯一索引 唯一索引 1.唯一索引在表上一个或者多个字段组合建立的索引,这个或者这些字段的值组合起来在表中不可以重复...非唯一索引 2.非唯一索引在表上一个或者多个字段组合建立的索引,这个或者这些字段的值组合起来在表中可以重复,不要求唯一。 主键索引(主索引) 3.主键索引(主索引唯一索引的特定类型。...表中创建主键时自动创建的索引 。一个表只能建立一个主索引聚集索引/非聚集索引 4.聚集索引(聚簇索引),表中记录的物理顺序与键值的索引顺序相同。一个表只能有一个聚集索引。...聚集索引的叶节点就是数据节点,而非聚集索引的叶节点仍然索引节点。 2.非聚集索引添加记录时,不会引起数据顺序的重组。...1.由于行数据和叶子节点存储在一起, 这样主键和行数据一起被载入内存的, 找到叶子节点就可以立刻将行数据返回了, 如果按照主键 Id 来组织数据, 获得数据更快。

    10.2K20

    MySQL表为什么必须有主键 – 关于聚集索引的简介

    注意:下面讨论的都是MySQL5.6版本中的innodb引擎。 比较规范的数据库表设计(包括我们公司)都会有一条不成文的规定,那就是给每张表一个自增主键。...Innodb的聚集索引 Innodb的存储索引基于B+tree,理所当然,聚集索引也是基于B+tree。与非聚集索引的区别则是,聚集索引既存储了索引,也存储了行值。...* Innodb如何选择一个聚集索引 对于Innodb,主键毫无疑问一个聚集索引。但是当一个表没有主键,或者没有一个索引,Innodb会如何处理呢。...还有一个需要注意的: 次级索引的叶子节点并不存储行数据的物理地址。而是存储的该行的主键值。 所以:一次级索引包含了两次查找。一次查找次级索引自身。...然后查找主键聚集索引) 现在应该明白了吧,建立自增主键的原因: Innodb中的每张表都会有一个聚集索引,而聚集索引又是以物理磁盘顺序来存储的,自增主键会把数据自动向后插入,避免了插入过程中的聚集索引排序问题

    99810

    聚集索引VS非聚集索引

    聚集索引VS非聚集索引 SQL Server 2014 发布日期: 2016年12月 索引与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度。 索引包含由表或视图中的一列或多列生成的键。...非聚集索引包含非聚集索引键值,并且每个键值项都有指向包含该键值的数据行的指针。 从非聚集索引中的索引行指向数据行的指针称为行定位器。 行定位器的结构取决于数据页存储在堆中还是聚集表中。...对于堆,行定位器指向行的指针。 对于聚集表,行定位器聚集索引键。 您可以向非聚集索引的叶级添加非键列以跳过现有的索引键限制(900 字节和 16 键列),并执行完整范围内的索引查询。...例如,如果创建了表并将一个特定列标识为主键,则 数据库引擎 自动对该列创建 PRIMARY KEY 约束和索引。...您的任务设计并创建最适合您的环境的索引,以便查询优化器可以从多个有效的索引中选择。 SQL Server 提供 数据库引擎优化顾问 以帮助分析数据库环境并选择适当的索引

    1.4K30

    聚集索引VS非聚集索引

    聚集索引VS非聚集索引 SQL Server 2014 发布日期: 2016年12月 索引与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度。 索引包含由表或视图中的一列或多列生成的键。...非聚集索引包含非聚集索引键值,并且每个键值项都有指向包含该键值的数据行的指针。 从非聚集索引中的索引行指向数据行的指针称为行定位器。 行定位器的结构取决于数据页存储在堆中还是聚集表中。...对于堆,行定位器指向行的指针。 对于聚集表,行定位器聚集索引键。 您可以向非聚集索引的叶级添加非键列以跳过现有的索引键限制(900 字节和 16 键列),并执行完整范围内的索引查询。...例如,如果创建了表并将一个特定列标识为主键,则 数据库引擎 自动对该列创建 PRIMARY KEY 约束和索引。...您的任务设计并创建最适合您的环境的索引,以便查询优化器可以从多个有效的索引中选择。 SQL Server 提供 数据库引擎优化顾问 以帮助分析数据库环境并选择适当的索引

    1.6K60

    聚集索引和非聚集索引(转)

    一  索引简介 索引关系型数据库中给数据库表中一列或多列的值排序后的存储结构,SQL的主流索引结构有B+树以及Hash结构,聚集索引以及非聚集索引用的B+树索引。...SQL Sever索引类型有:唯一索引主键索引聚集索引,非聚集索引MySQL 索引类型有:唯一索引主键聚集索引,非聚集索引,全文索引。...二  聚集索引 聚集(clustered)索引,也叫聚簇索引。 定义:数据行的物理顺序与列值(一般主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引。...1.创建表的时候指定主键(注意:SQL Sever默认主键聚集索引,也可以指定为非聚集索引,而MySQL主键就是聚集索引) create table t1( id int primary key...(colum_name) MySQL alter table table_name add primary key(colum_name) 值得注意的,最好还是在创建表的时候添加聚集索引,由于聚集索引的物理顺序上的特殊性

    96410

    MySQL 聚集索引和二级索引

    每张使用 InnoDB 作为存储引擎的表都有一个特殊的索引称为聚集索引,它保存着每一行的数据,通常,聚集索引就是主键索引。...如果你的表定义了一个主键,InnoDB 就使用它作为聚集索引。因此,尽可能的为你的表定义一个主键,如果实在没有一个数据列唯一且非空的可以作为主键列,建议添加一个自动递增列作为主键列。...如果你的表没有定义主键,InnoDB 会选择第一个唯一非空索引来作为聚集索引。...除了聚集索引外的其他索引类型都属于二级索引。在 InnoDB 中,二级索引中的每个记录都包含该行的主键列,以及二级索引指定的列;聚集索引中,InnoDB 通过主键值来查询数据行。...如果主键过长,二级索引就需要更大的空间,因此,使用短的主键很有利的。

    1K20

    聚集索引和非聚集索引简析与对比

    聚集(clustered)索引,也叫聚簇索引 定义:数据行的物理顺序与列值(一般主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引。...创建表的时候指定主键(注意:SQL Sever默认主键聚集索引,也可以指定为非聚集索引,而MySQL主键就是聚集索引) create table t1( id int primary key..., name nvarchar(255) ) 创建表后添加聚集索引 MySQL alter table table_name add primary key(colum_name) 值得注意的...分析:如果认为是的朋友,可能受系统默认设置的影响,一般我们指定一个表的主键,如果这个表之前没有聚集索引,同时建立主键时候没有强制指定使用非聚集索引,SQL会默认在此字段上创建一个聚集索引,而主键都是唯一的...第五:在主键创建聚集索引的表在数据插入上为什么比主键上创建非聚集索引表速度要慢?

    1.7K21

    答对这题offer稳一半,什么聚集索引和非聚集索引

    另外,我花了很长时间,准备了一份500页的PDF面试资料文档和一份10W字的Java总结面试题和答案, 简单来说,聚集索引就是基于主键创建的索引,除了主键索引以外的其他索引,称为非聚集索引,也叫做二级索引...由于在 InnoDB 引擎里面,一张表的数据对应的物理文件本身就是按照 B+树来组织的一种索引结构,而聚集索引就是按照每张表的主键来构建一颗 B+树,然后叶子节点里面存储了这个表的每一行数据记录。...需要注意的,InnoDB 里面只能存在一个聚集索引,原因很简单,如果存在多个聚集索引,那么意味着这个表里面的数据存在多个副本,造成磁盘空间的浪费,以及数据维护的困难。...由于在 InnoDB 里面,主键索引表示的一种数据存储结构,所以如果基于非聚集索引来查询一条完整的记录,最终还是需要访问主键索引来检索。 这个问题要回答好,还真不容易。...涉及到 MySQL里面索引的实现原理。但是如果回答好了,就能够很好的反馈求职者的技术功底,那通过面试就比较容易了。 最后,我把之前分享的资料全部整理成了文字,希望能够以此来提高各位粉丝的通过率。

    41320

    SQL Server 索引和表体系结构(聚集索引+非聚集索引

    存储 在SQL Server中,存储数据的最小单位页,数据页的大小8K,,8个页组成一个区64K,每一页所能容纳的数据为8060字节,聚集索引的叶节点存储的实际数据行,而且每页数据行顺序存储,数据行基于聚集索引键按顺序存储...聚集索引列选择 窄列(字段长度短的列):由于索引页存储的索引记录,索引记录存储的索引建值和指针,为了让索引列存储更多的索引记录,所以我们选择窄列。...,或是行的聚集索引键,如下所述: 如果表堆(意味着该表没有聚集索引),则行定位器指向行的指针。...注意:上图中的数据页聚集索引或者堆数据行,而不是非聚集索引的数据页,在非聚集索引中不存在数据页,非聚集索引中的叶子层和根节点与中间节点有点不同,它的指针指向数据行,且如果非聚集索引如果包含列索引,...大量非重复值,如姓氏和名字的组合(前提聚集索引被用于其他列)。

    2.1K90

    MySQL 聚集索引(InnoDB)和 非聚集索引(MyISAM) 精讲~两张图彻底搞懂

    B站搜索“乐哥聊编程“有本篇文章配套视频‍ https://www.bilibili.com/video/BV1je4y117yP 非聚集索引(MyISAM) 索引和数据单独存放 表有三个文件 叶子结点存放行数据地址信息...通过查找到主键key,然后还得根据指针地址去数据表中找对应的数据行 聚集索引(InnoDB) 索引和数据存放在一起 创建表之后会产生两个文件 叶子结点存放行数据 留几个关于InnoDB 常见的几个面试题...答案见B站视频:https://www.bilibili.com/video/BV1je4y117yP 为什么DBA要求我们必须要给Innodb表建主键?...为什么DBA推荐我们使用整型做主键? 为什么Innodb非主键索引叶子节点存储的主键值,而不是数据本身?

    57640

    InnoDB 聚集索引和非聚集索引、覆盖索引、回表、索引下推简述

    聚集索引和非聚集索引MySQL 数据库中 InnoDB 存储引擎,B+ 树可分为聚集索引和非聚集索引聚集索引也叫聚簇索引,非聚集索引也叫辅助索引或者二级索引。...建表的时候都会创建一个聚集索引,每张表都有唯一的聚集索引: 如果主键被定义了,那么这个主键就是作为聚集索引 如果没有主键被定义,那么该表的第一个唯一非空索引作为聚集索引 如果没有主键也没有唯一索引,InnoDB...内部会生成一个隐藏的主键作为聚集索引,这个隐藏的主键一个 6 个字节的列,该类的值会随着数据的插入自增。...当创建表和插入数据后会生成两棵树: 其中左边的聚集索引,右边的是非聚集索引。非聚集索引叶子节点存储的主键的值,聚集索引存储的整行的数据。...这条语句在 Mysql 5.6 之前和 Mysql 5.6 以及 Mysql 5.6 以后版本执行不一致的。

    1.3K20

    mysql 唯一索引_mysql主键和唯一索引的区别

    Mysql索引大概有五种类型: 普通索引(INDEX):最基本的索引,没有任何限制 唯一索引(UNIQUE):与”普通索引”类似,不同的就是:索引列的值必须唯一,但允许有空值。...主键索引(PRIMARY):它 一种特殊的唯一索引,不允许有空值。...联合(组合)索引:为了更多的提高mysql效率可建立组合索引,遵循”最左前缀“原则。 这里我们来看下唯一索引。...之前我们看了主键索引,他一种特殊的唯一索引,二者的区别是,主键索引不能有空值,但是唯一索引可以有空值。...但是,唯一性约束所在的列并不是表的主键列。 3:唯一性约束强制在指定的列上创建一个唯一性索引。在默认情况下,创建唯一性的非聚簇索引,但是,也可以指定所创建的索引聚簇索引

    2.8K30

    一句话说清聚集索引和非聚集索引以及MySQL的InnoDB和MyISAM

    聚集索引和非聚集索引以及MySQL的InnoDB和MyISAM经常遇到有人向我咨询这个问题,其实呢,数据库 聚集索引和非聚集索引以及MySQL...看这种图表就一切都明白了: 存储引擎 索引类型 主键叶子节点 非主键叶子节点 MyISAM 非聚簇 数据地址 数据地址 InnoDB 聚簇 全部数据 主键值 key重复 不能 能 问题:InnoDB...Nonclustered indexes:非聚集索引,又称非聚簇索引。 Secondary Key:二级索引,因为聚集索引只能有一个,所有同一个表其他字段只能二级索引也就是非聚集索引。...InnDB最关键的就是聚集索引叶子节点存所有的数据项,二级索引存的主键值,而不是行指针,而MyISAM存的行指针:  ?...这个索引的key数据表的主键,因此InnoDB表数据文件本身就是主索引。 ? 第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址: ?

    4.6K31
    领券