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

Mysql聚集索引和非聚集索引

首先要明确一个概念,在聚集索引的世界里索引就是数据,在最后的叶子索引键保存着对应的数据行。...举个例子: 表TestNonclusteredIndex ID col1 1 4 2 5 3 6 4 7 其中ID列上有聚集索引,col1上是非聚集索引 执行下面语句: select...如果执行这条查询语句: 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 使用非聚集索引。...1.聚集索引 1.1 介绍 聚集索引(Clustered Index)也叫聚簇索引,一般以主键建立索引。 在 InnoDB 中如果没有定义主键,会选择第一个非空唯一索引来代替。...1.2 优点 主键查询效率更高 通过主键使用聚集索引查找数据比非聚集索引要快,因为非聚集索引定位到对应主键时还要多一次目标记录磁盘 IO,即回表查询。...2.非聚集索引 按照语义,除了聚集索引,其他索引都是非聚集索引。 但在这里非聚集索引特指索引树叶结点存储的是「索引+数据地址」的索引。...一个表中只能有一个聚集索引,而非聚集索引可以有多个。 磁盘 IO 次数不同。 聚集索引通过一次索引查询可以直接找到数据,而非聚集索引需要一次索引查询到数据地址,外加一次数据磁盘 IO。

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

    聚集索引VS非聚集索引

    表或视图可以包含以下类型的索引: 群集 聚集索引根据数据行的键值在表或视图中排序和存储这些数据行。 索引定义中包含聚集索引列。...每个表只能有一个聚集索引,因为数据行本身只能按一个顺序排序。 只有当表包含聚集索引时,表中的数据行才按排序顺序存储。 如果表具有聚集索引,则该表称为聚集表。...如果表没有聚集索引,则其数据行存储在一个称为堆的无序结构中。 非聚集聚集索引具有独立于数据行的结构。...非聚集索引包含非聚集索引键值,并且每个键值项都有指向包含该键值的数据行的指针。 从非聚集索引中的索引行指向数据行的指针称为行定位器。 行定位器的结构取决于数据页是存储在堆中还是聚集表中。...对于聚集表,行定位器是聚集索引键。 您可以向非聚集索引的叶级添加非键列以跳过现有的索引键限制(900 字节和 16 键列),并执行完整范围内的索引查询。

    1.4K30

    聚集索引VS非聚集索引

    表或视图可以包含以下类型的索引: 群集 聚集索引根据数据行的键值在表或视图中排序和存储这些数据行。 索引定义中包含聚集索引列。...每个表只能有一个聚集索引,因为数据行本身只能按一个顺序排序。 只有当表包含聚集索引时,表中的数据行才按排序顺序存储。 如果表具有聚集索引,则该表称为聚集表。...如果表没有聚集索引,则其数据行存储在一个称为堆的无序结构中。 非聚集聚集索引具有独立于数据行的结构。...非聚集索引包含非聚集索引键值,并且每个键值项都有指向包含该键值的数据行的指针。 从非聚集索引中的索引行指向数据行的指针称为行定位器。 行定位器的结构取决于数据页是存储在堆中还是聚集表中。...对于聚集表,行定位器是聚集索引键。 您可以向非聚集索引的叶级添加非键列以跳过现有的索引键限制(900 字节和 16 键列),并执行完整范围内的索引查询。

    1.6K60

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

    之前松哥在前面的文章中介绍 MySQL索引时,有小伙伴表示被概念搞晕了,主键索引、非主键索引、聚簇索引、非聚簇索引、二级索引、辅助索引等等,今天咱们就来捋一捋这些概念。 1....全文索引MySQL 中支持的版本也需要大家留意一下: MySQL 5.6 以前的版本,只有 MyISAM 存储引擎支持全文索引。...MySQL 5.6 及以后的版本,MyISAM 和 InnoDB 存储引擎均支持全文索引。...MySQL 的全文索引最开始只支持英文,因为英文分词比较方便;中文分词就比较麻烦,所以最早的 MySQL 全文索引是不支持中文的。...不过 MySQL 的全文索引并不好用,有这方面的需求还是直接上 Es 吧。

    2.2K20

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

    SQL Sever索引类型有:唯一索引,主键索引聚集索引,非聚集索引MySQL 索引类型有:唯一索引,主键(聚集索引,非聚集索引,全文索引。...因此在查询方面,聚集索引的速度往往会更占优势。 创建聚集索引 如果不创建索引,系统会自动创建一个隐含列作为表的聚集索引。...1.创建表的时候指定主键(注意:SQL Sever默认主键为聚集索引,也可以指定为非聚集索引,而MySQL里主键就是聚集索引) create table t1( id int primary key...(colum_name) MySQL alter table table_name add primary key(colum_name) 值得注意的是,最好还是在创建表的时候添加聚集索引,由于聚集索引的物理顺序上的特殊性...其实按照定义,除了聚集索引以外的索引都是非聚集索引,只是人们想细分一下非聚集索引,分成普通索引,唯一索引,全文索引

    95510

    MySQL 聚集索引和二级索引

    每张使用 InnoDB 作为存储引擎的表都有一个特殊的索引称为聚集索引,它保存着每一行的数据,通常,聚集索引就是主键索引。...If you do not define a PRIMARY KEY for your table, MySQL locates the first UNIQUE index where all the...如果你的表没有定义主键,InnoDB 会选择第一个唯一非空索引来作为聚集索引。...如果你的表既没有主键,又没有合适的唯一索引,InnoDB 内部会生成一个隐式聚集索引 —— GEN_CLUST_INDEX,该索引建立在由 rowid 组成的合成列上。...除了聚集索引外的其他索引类型都属于二级索引。在 InnoDB 中,二级索引中的每个记录都包含该行的主键列,以及二级索引指定的列;聚集索引中,InnoDB 通过主键值来查询数据行。

    99620

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

    聚集索引实际存放的示意图 从上图可以看出聚集索引的好处了,索引的叶子节点就是对应的数据节点(MySQL的MyISAM除外,此存储引擎的聚集索引和非聚集索引只多了个唯一约束,其他没什么区别),可以直接获取到对应的全部列的数据...因此在查询方面,聚集索引的速度往往会更占优势。 创建聚集索引 如果不创建索引,系统会自动创建一个隐含列作为表的聚集索引。...创建表的时候指定主键(注意:SQL Sever默认主键为聚集索引,也可以指定为非聚集索引,而MySQL里主键就是聚集索引) create table t1( id int primary key..., name nvarchar(255) ) 创建表后添加聚集索引 MySQL alter table table_name add primary key(colum_name) 值得注意的是...其实按照定义,除了聚集索引以外的索引都是非聚集索引,只是人们想细分一下非聚集索引,分成普通索引,唯一索引,全文索引

    1.7K21

    MySQL索引需要的原则

    1.选择唯一性索引 唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。例如,学生表中学号是具有唯一性的字段。为该字段建立唯一性索引可以很快的确定某个学生的信息。...因此,为这样的字段建立索引,可以提高整个表的查询速度。 4.限制索引的数目 索引的数目不是越多越好。每个索引都需要占用磁盘空间,索引越多,需要的磁盘空间就越大。修改表时,对索引的重构和更新很麻烦。...越多的索引,会使更新表变得很浪费时间。 5.尽量使用数据量少的索引 如果索引的值很长,那么查询的速度会受到影响。...mysql会一直向右匹配直到遇到范围查询(>、 3 and d = 4 如果建立(a,b,c,d)顺序的索引...比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式 10.尽量选择区分度高的列作为索引

    1.7K20

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

    ,所以一个数据表只能一个聚集索引。...聚集索引列选择 窄列(字段长度短的列):由于索引页存储的是索引记录,索引记录存储的是索引值和指针,为了让索引列存储更多的索引记录,所以我们选择窄列。...不重复的列:由于聚集索引的数据页中的数据记录是按聚集的顺序存储,当向聚集列中插入重复的记录,当数据页超过8060K就会造成分页,分页会将原页中的一半记录插入到新页中,而产生索引碎片。...非聚集索引聚集索引一样都是B-树结构,但是非聚集索引不改变数据的存储方式,所以一个表允许多个非聚集索引;非聚集索引的叶层是由索引页而不是由数据页组成,索引行包含索引键值和指向表数据存储位置的行定位器...,对于当个字段索引聚集索引所占的空间要小于聚集索引,因为非聚集索引不需要存储数据行,对于全覆盖索引除外。

    2.1K90

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

    聚集索引和非聚集索引MySQL 数据库中 InnoDB 存储引擎,B+ 树可分为聚集索引和非聚集索引聚集索引也叫聚簇索引,非聚集索引也叫辅助索引或者二级索引。...表的时候都会创建一个聚集索引,每张表都有唯一的聚集索引: 如果主键被定义了,那么这个主键就是作为聚集索引 如果没有主键被定义,那么该表的第一个唯一非空索引作为聚集索引 如果没有主键也没有唯一索引,InnoDB...索引下推(icp) 索引下推是 mysql 5.6 新特性 创建一个表 use,其中主要有几个字段:id、name、age、address。建立联合索引(name,age)。...这条语句在 Mysql 5.6 之前和 Mysql 5.6 以及 Mysql 5.6 以后版本执行是不一致的。...Mysql 5.6 之前 在 5.6 之前是没有索引下推的,只能从 ID3 开始一个个回表,虚线表示回表。

    1.2K20

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

    聚集索引和非聚集索引以及MySQL的InnoDB和MyISAM经常遇到有人向我咨询这个问题,其实呢,数据库 聚集索引和非聚集索引以及MySQL...=============  名词解释 Clustered Index:聚集索引,又称聚簇索引。...Nonclustered indexes:非聚集索引,又称非聚簇索引。 Secondary Key:二级索引,因为聚集索引只能有一个,所有同一个表其他字段只能是二级索引也就是非聚集索引。...看看经典著作《高性能MySQL(第3版)》关于聚簇索引的说明: ? 再看看关于隐式创建聚簇索引的说明: ? 关于二级索引: ? MyISAM的数据分布: ?...下面这个帖子也是写的极好的 ,作者很会画图,整体还是没用超越《高性能MySQL(第3版)》,如果上面的还看不懂可以看看此贴--《MySQL索引背后的数据结构及算法原理》。

    4.6K31

    主键、聚集索引、辅助索引

    那下面这段没定义主键的表语句是正确的吗?...InnoDB 存储引擎将选择表时第一个定义的非空唯一索引为主键。需要注意的是!主键的选择根据的是非空唯一索引定义的顺序,而不是表时列的顺序。...这也就是为什么大部分情况下查询优化器倾向于采用聚集索引了。 可以这么说:在聚集索引中,索引即数据,数据即索引。...一张表只能有一个主键,并且也只能有一个聚集索引聚集索引还是按照主键来构建的,那这种种迹象不都表明主键就是聚集索引? 事实上,主键和索引就不是一个层次的东西!...所以,不要说 “主键就是聚集索引”,应该这样说:“聚集索引一般都是加在主键上的”。 聚集索引和辅助索引的关系 辅助索引(Secondary Index)也称为 非聚集索引、二级索引

    79310

    mysql索引多了有什么坏处

    建立索引常用的规则如下: 1、表的主键、外键必须有索引; 2、数据量超过300的表应该有索引; 3、经常与其他表进行连接的表,在连接字段上应该建立索引; 4、经常出现在Where子句中的字段,特别是大表的字段...,应该建立索引; 5、索引应该建在选择性高的字段上; 6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要索引; 7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:  A、正确选择复合索引中的主列字段...如果是,则可以建立复合索引;否则考虑单字段索引;  C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;   D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性...,考虑减少复合的字段;  C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引; 进行数据操作的表,不要建立太多的索引; 9、删除无用的索引,避免对执行计划造成负面影响...因为太多的索引与不充分、不正确的索引对性能都毫无益处:在表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。

    2.7K20

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

    唯一索引/非唯一索引 主键索引(主索引聚集索引/非聚集索引 组合索引 唯一索引/非唯一索引 唯一索引 1.唯一索引是在表上一个或者多个字段组合建立的索引,这个或者这些字段的值组合起来在表中不可以重复...表中创建主键时自动创建的索引 。一个表只能建立一个主索引聚集索引/非聚集索引 4.聚集索引(聚簇索引),表中记录的物理顺序与键值的索引顺序相同。一个表只能有一个聚集索引。...扩展:聚集索引和非聚集索引的区别?分别在什么情况下使用? 聚集索引和非聚集索引的根本区别是表中记录的物理顺序和索引的排列顺序是否一致。...非聚集索引的记录的物理顺序和索引的顺序不一致 其他方面的区别: 1.聚集索引和非聚集索引都采用了 B+树的结构,但非聚集索引的叶子层并不与实际的数据页相重叠,而采用叶子层包含一个指向表中的记录在数据页中的指针的方式...聚集索引的叶节点就是数据节点,而非聚集索引的叶节点仍然是索引节点。 2.非聚集索引添加记录时,不会引起数据顺序的重组。

    9.2K20

    MySQL索引的原理,B+树、聚集索引和二级索引的结构分析

    mysql中,存储引擎用类似的方法使用索引,先在索引中找到对应值,然后根据匹配的索引记录找到对应的行。 B树索引 大多数存储引擎都支持B树索引。...上述索引无法用于查找last_name为Smith并且某个特定生日的人。如果不指定first_name,则mysql只能使用索引的第一列。...因为是存储引擎负责实现索引,因此不是所有的存储引擎都支持聚集索引。InnoDB表中聚集索引索引列就是主键,所以聚集索引也叫主键索引。...这是一课B+树,它的叶子页包含了行的全部数据,节点页只包含了索引列(即主键)。 二级索引 对于InnoDB表,在非主键列的其他列上索引就是二级索引(因为聚集索引只有一个)。...聚集索引索引和数据保存在同一个B树中,因此从聚集索引中获取数据比在非聚集索引中要快一些。 聚集索引的缺点: 插入速度严重依赖插入顺序。按照主键的顺序插入是加载数据到InnoDB表中速度最快的方式。

    2.5K30

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券