我的编程空间,编程开发者的网络收藏夹
学习永远不晚

mysql聚集索引和非聚集索引的区别

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

mysql聚集索引和非聚集索引的区别

本篇内容介绍了“mysql聚集索引和非聚集索引的区别”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

总结:

1、mysql的innodb表,就是索引组织表,表中的所有数据行都放在索引上,这就约定了数据是严格按照顺序存放的,所以不管插入的先后顺序,它在那个物理上的那个位置与插入的先后顺序无关。

2、聚集索引,叶子节点存的是整行数据,直接通过这个聚集索引的键值找到某行

3、聚集索引,数据的物理存放顺序与索引顺序是一致的,即:只要索引是相邻的,那么对应的数据一定也是相邻地存放在磁盘上的。

4、聚集索引,数据行和相邻的键值紧凑地存储在一起,因为无法同时把数据行存放在两个不同的地方,所以一个表只能有一个聚集索引。

5、非聚集索引,叶子节点存的是字段的值,通过这个非聚集索引的键值找到对应的聚集索引字段的值,再通过聚集索引键值找到表的某行,类似oracle通过键值找到rowid,再通过rowid找到行

6、mysql的innodb表,其聚集索引相当于整张表,而整张表也是聚集索引。默认通过主键聚集数据,如果没有定义主键,则选择第一个非空的唯一索引,如果没有非空唯一索引,则选择rowid来作为聚集索引

7、mysql的innodb表,因为整张表也是聚集索引,select出来的结果是顺序排序的,比如主键字段的数据插入顺序可以是5、3、4、2、1,查询时不带order by得出的结果也是按1、2、3、4、5排序

8、通俗理解

聚集索引:类似新华字典正文内容本身就是一种按照一定规则排列的目录

非聚集索引:这种目录纯粹是目录,正文纯粹是正文的排序方式

每个表只能有一个聚集索引,因为目录只能按照一种方法进行排序。

9、oracle一般使用堆表,mysql的innodb是索引组织表

9.1、堆表以一种显然随机的方式管理,数据插入时时存储位置是随机的,主要是数据库内部块的空闲情况决定,数据会放在最合适的地方,而不是以某种特定顺序来放置。

9.2、堆表的存储速度因为不用考虑排序, 所以存储速度会比较快. 但是要查找符合某个条件的记录, 就必须得读取全部的记录以便筛选。

9.3、堆表其索引中记录了记录所在位置的rowid,查找的时候先找索引,然后再根据索引rowid找到块中的行数据。

9.4、堆表的索引和表数据是分离的

9.5、索引组织表,其行数据以索引形式存放,因此找到索引,就等于找到了行数据。

9.6、索引组织表索引和数据是在一起的

基于主键索引和普通索引的查询有什么区别?

mysql> create table T( id int primary key,k int not null,name varchar(16),index (k))engine=InnoDB;

(ID,k) 值分别为 (100,1)、(200,2)、(300,3)、(500,5) 和 (600,6)

主键索引的叶子节点存的是整行数据。在 InnoDB 里,主键索引也被称为聚集索引(clustered index)。

非主键索引的叶子节点内容是主键的值。在 InnoDB 里,非主键索引也被称为二级索引(secondary index)。

如果语句是 select * from T where ID=500,即主键查询方式,则只需要搜索 ID 这棵 B+树;

如果语句是 select * from T where k=5,即普通索引查询方式,则需要先搜索 k 索引树,得到 ID的值为 500,再到 ID 索引树搜索一次。这个过程称为回表

B+ 树为了维护索引有序性,在插入新值的时候需要做必要的维护。以上面为例,如果插入新的行 ID 值为 700,则只只需要在 R5 的记录后面插入一个新记录。如果新插入的 ID值为 400,就相对麻烦了,需要逻辑上挪动后面的数据,空出位置。

test1表innodb引擎,索引和数据放在一个文件里面

-rw-r----- 1 mysql mysql  8678 Nov 20 14:05 test1.frm

-rw-r----- 1 mysql mysql 98304 Nov 20 16:51 test1.ibd

test2表myisam引擎,索引和数据放在不同文件

-rw-r----- 1 mysql mysql  8558 Nov 22 10:22 test2.frm

-rw-r----- 1 mysql mysql     0 Nov 22 10:22 test2.MYD

-rw-r----- 1 mysql mysql  1024 Nov 22 10:22 test2.MYI

https://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_table

table

The rows of an InnoDB table are organized into an index structure known as the clustered index, with entries sorted based on the primary key columns of the table. Data access is optimized for queries that filter and sort on the primary key columns, and each index contains a copy of the associated primary key columns for each entry. Modifying values for any of the primary key columns is an expensive operation. Thus an important aspect of InnoDB table design is choosing a primary key with columns that are used in the most important queries, and keeping the primary key short, with rarely changing values.

InnoDB表的行被组织成称为聚集索引的索引结构,条目根据表的主键列进行排序。 数据访问针对对主键列进行筛选和排序的查询进行了优化,每个索引都包含每个条目的关联主键列的副本。 修改任何主键列的值是一项昂贵的操作。 因此,InnoDB表设计的一个重要方面是选择一个主键,该主键具有在最重要的查询中使用的列,并保持主键很短,很少更改值。

https://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_clustered_index

clustered index

The InnoDB term for a primary key index. InnoDB table storage is organized based on the values of the primary key columns, to speed up queries and sorts involving the primary key columns. For best performance, choose the primary key columns carefully based on the most performance-critical queries. Because modifying the columns of the clustered index is an expensive operation, choose primary columns that are rarely or never updated.In the Oracle Database product, this type of table is known as an index-organized table

InnoDB术语表示主键索引。 InnoDB表存储基于主键列的值进行组织,以加速涉及主键列的查询和排序。 为获得最佳性能,请根据性能最关键的查询仔细选择主键列。 因为修改聚集索引的列是一项昂贵的操作,所以选择很少或从不更新的主列。在Oracle数据库产品中,此类表称为索引组织表。

https://dev.mysql.com/doc/refman/5.7/en/innodb-index-types.html

Every InnoDB table has a special index called the clustered index where the data for the rows is stored. Typically, the clustered index is synonymous with the primary key. 

When you define a PRIMARY KEY on your table, InnoDB uses it as the clustered index. Define a primary key for each table that you create. If there is no logical unique and non-null column or set of columns, add a new auto-increment column, whose values are filled in automatically.

If you do not define a PRIMARY KEY for your table, MySQL locates the first UNIQUE index where all the key columns are NOT NULL and InnoDB uses it as the clustered index.

If the table has no PRIMARY KEY or suitable UNIQUE index, InnoDB internally generates a hidden clustered index named GEN_CLUST_INDEX on a synthetic column containing row ID values. The rows are ordered by the ID that InnoDB assigns to the rows in such a table. The row ID is a 6-byte field that increases monotonically as new rows are inserted. Thus, the rows ordered by the row ID are physically in insertion order.

Accessing a row through the clustered index is fast because the index search leads directly to the page with all the row data. If a table is large, the clustered index architecture often saves a disk I/O operation when compared to storage organizations that store row data using a different page from the index record.

All indexes other than the clustered index are known as secondary indexes. In InnoDB, each record in a secondary index contains the primary key columns for the row, as well as the columns specified for the secondary index. InnoDB uses this primary key value to search for the row in the clustered index.

每个InnoDB表都有一个称为聚集索引的特殊索引,其中存储了行的数据。通常,聚集索引与主键同义。

在表上定义PRIMARY KEY时,InnoDB将其用作聚集索引。为您创建的每个表定义主键。如果没有逻辑唯一且非空列或一组列,请添加一个新的自动增量列,其值将自动填充。

如果没有为表定义PRIMARY KEY,MySQL将找到第一个UNIQUE索引,其中所有键列都是NOT NULL,而InnoDB将它用作聚集索引。

如果表没有PRIMARY KEY或合适的UNIQUE索引,InnoDB会在包含行ID值的合成列内部生成名为GEN_CLUST_INDEX的隐藏聚集索引。这些行按InnoDB分配给此类表中的行的ID排序。行ID是一个6字节的字段,在插入新行时会单调增加。因此,由行ID排序的行在物理上处于插入顺序。

通过聚集索引访问行很快,因为索引搜索直接指向包含所有行数据的页面。 如果表很大,则与使用与索引记录不同的页面存储行数据的存储组织相比,聚集索引体系结构通常会保存磁盘I / O操作。

除聚集索引之外的所有索引都称为辅助索引。 在InnoDB中,辅助索引中的每个记录都包含该行的主键列以及为辅助索引指定的列。 InnoDB使用此主键值来搜索聚集索引中的行。

“mysql聚集索引和非聚集索引的区别”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

mysql聚集索引和非聚集索引的区别

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

mysql聚簇索引和非聚簇索引区别

聚簇索引的行按索引键顺序物理存储,非聚簇索引的行不按顺序存储且包含指向数据行的指针。聚簇索引提高范围和等值查询性能,每个表只能有一个;非聚簇索引允许在多个列上创建索引,每个表可以有多个。MySQL 聚簇索引和非聚簇索引的区别聚簇索引和非聚
mysql聚簇索引和非聚簇索引区别
2024-08-01

搞懂MySQL聚集索引与非聚集索

我们在开发或者面试的过程中经常会涉及到索引。今天我们来详细剖析一下索引常用的知识点。首先我们先介绍mysql的常用的存储引擎,其次是索引分类。

MySQL聚簇索引和非聚簇索引的区别详情

目录聚簇索引非聚簇索引总结前言:在 mysql 默认引擎 InnoDB 中,索引大致可分为两类:聚簇索引和非聚簇索引,它们的区别也是常见的面试题,所以我们今天就来盘它们。聚簇索引聚簇索引(Clustered Index)一般指的是主键
2022-06-14

mysql聚簇索引和非聚簇索引有什么区别

MySQL中的聚簇索引和非聚簇索引是两种不同的索引类型,它们在存储和查询数据时有一些区别:聚簇索引:聚簇索引将数据行存储在索引的叶子节点中,而不是单独的数据页中。这意味着索引本身就是数据的一部分,可以通过索引直接访问数据,而不需要额外的查找
mysql聚簇索引和非聚簇索引有什么区别
2024-04-09

MySQL聚簇索引和非聚簇索引的区别是什么

这篇文章主要介绍“MySQL聚簇索引和非聚簇索引的区别是什么”,在日常操作中,相信很多人在MySQL聚簇索引和非聚簇索引的区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL聚簇索引和非聚簇索引
2023-07-02

MySQL 聚集索引和二级索引

Clustered and Secondary Indexes(聚集索引和二级索引)Every InnoDB table has a special index called the clustered index where the data for the
MySQL 聚集索引和二级索引
2022-03-11

MySQL之聚簇索引与非聚簇索引

MySQL之聚簇索引与非聚簇索引 聚簇索引非聚簇索引聚簇索引和非聚簇索引的区分MySQL索引实现InnoDB索引实现MyISAM索引实现 问答 索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,主要讨论Inn
2023-08-30

详解MySQL 聚簇索引与非聚簇索引

1、聚集索引 表数据按照索引的顺序来存储的,也就是说索引项的顺序与表中记录的物理顺序一致。对于聚集索引,叶子结点即存储了真实的数据行,不再有另外单独的数据页。 在一张表上最多只能创建一个聚集索引,因为真实数据的物理顺序只能有一种。 从物理文
2022-05-14

mysql聚簇索引和非聚簇索引有什么不同

MySQL中的聚簇索引和非聚簇索引有以下不同点:1. 存储方式:聚簇索引中,数据行的顺序与索引的顺序一致,索引直接指向数据行。非聚簇索引中,索引是独立于数据行的,索引中的每个条目都包含一个指向对应数据行的指针。2. 数据访问:使用聚簇索引进
2023-09-15

MySQL中的聚簇索引、非聚簇索引、联合索引和唯一索引是什么

今天小编给大家分享一下MySQL中的聚簇索引、非聚簇索引、联合索引和唯一索引是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下
2023-04-21

MySQL中聚簇索引与非聚簇索引的实现

目录基本概念和作用说明聚簇索引非聚簇索引示例一:创建索引示例二:索引的选择示例三:索引的维护示例四:索引与性能http://www.lsjlt.com优化示例五:索引的限制结论与讨论引发点在mysql数据库中,索引是提高查询性能的关键工具。
MySQL中聚簇索引与非聚簇索引的实现
2024-09-18

聚集索引和非聚集索引,很简单的面试题,但是很多人都不知道

非聚簇索引是将索引和数据分开存储,那么在访问数据的时候就需要2次查找,但是和InnoDB的非聚簇部分还是有所区别。InnoDB是需要查找2次树,先查找辅助索引树,再查找聚簇索引树(这个过程也叫回表)。而MyISAM的主键索引叶子结点的存储的

编程热搜

目录