`

聚簇索引

阅读更多
    聚簇索引不是一种单独的索引类型,而是一种数据存储方式。当表有聚簇索引时,它的叶子页包含了行的全部数据,而节点页只包含了索引列。因为无法同时把数据行存放在两个不同的地方,所以一个表只能有一个聚簇索引(不过覆盖索引可以模拟多个聚簇索引的情况)。
    下图展示了聚簇索引中的记录是如何存放的。

    InnoDB 引擎是通过主键来聚集数据的,这表示图中“被索引的列”就是主键列。如果没有定义主键,InnoDB 会选择一个唯一的非空索引代替。如果没有这样的索引,它会隐式定义一个主键来作为聚簇索引。InnoDB 只聚集在同一个页面中的记录,因此包含相邻键值的页面可能会相距甚远。
    聚集的数据主要有以下这些重要的优点:
    (1)可以把相关数据保存在一起。例如实现电子邮箱时,可以根据用户 ID 来聚集数据,这样就只需要从磁盘读取少数的数据页就能获取某个用户的全部邮件。如果没有使用聚簇索引,则每封邮件都可能导致一次磁盘 I/O。
    (2)数据访问更快。聚簇索引将索引和数据保存在同一个 B-Tree 中,因此从聚簇索引中获取数据通常比在非聚簇索引中查找要快。
    (3)使用覆盖索引扫描的查询可以直接使用页节点中的主键值。
    而聚簇索引也有一些缺点:
    (1)聚簇数据最大限度地提高了 I/O 密集型应用的性能,但如果数据全部都存放在内存中,则访问的顺序就没那么重要了,聚簇索引也就没什么优势了。
    (2)插入速度严重依赖于插入顺序。按照主键的顺序插入是加载数据到 InnoDB 表中速度最快的方式,但如果不是按照主键顺序加载数据,那么在加载完成后最好使用 OPTIMIZE TABLE 命令重新组织一下表。
    (3)更新聚簇索引列的代价很高,因为会强制 InnoDB 将每个被更新的行移动到新的位置。
    (4)基于聚簇索引的表在插入新行或者主键被更新导致需要移动行的时候,可能面临“页分裂”的问题。当行的主键值要求必须将这一行插入到某个已满的页中时,存储引擎会将该页分成两个页面来容纳该行。页分裂会导致表占用更多的磁盘空间。
    (5)聚簇索引可能导致全表扫描变慢,尤其是行比较稀疏,或者由于页分裂导致数据存储不连续的时候。
    (6)二级索引(非聚簇索引)可能比想象的要更大,因为在二级索引的叶子节点包含了引用行的主键列。
    (7)二级索引访问需要两次索引查找,而不是一次。因为二级索引叶子节点保存的不是指向行的物理位置的指针,而是行的主键值。这表示通过二级索引查找行时,存储引擎需要找到二级索引的叶子节点获得对应的主键值,然后根据这个值去聚簇索引中找到对应的行。不过对于 InnoDB,自适应哈希索引能够减少这样的重复工作。
  • 大小: 74.6 KB
分享到:
评论

相关推荐

    005.聚簇索引与非聚簇索引b+树实现有什么区别?.mp4

    聚簇索引与非聚簇索引b+树实现有什么区别?.mp4 聚簇索引与非聚簇索引b+树实现有什么区别?.mp4 聚簇索引与非聚簇索引b+树实现有什么区别?.mp4 聚簇索引与非聚簇索引b+树实现有什么区别?.mp4 聚簇索引与非聚簇索引...

    006.说一下B+树中聚簇索引的查找(匹配)逻辑.mp4

    说一下B+树中聚簇索引的查找(匹配)逻辑.mp4 说一下B+树中聚簇索引的查找(匹配)逻辑.mp4 说一下B+树中聚簇索引的查找(匹配)逻辑.mp4 说一下B+树中聚簇索引的查找(匹配)逻辑.mp4 说一下B+树中聚簇索引的查找...

    69 更新数据的时候,自动维护的聚簇索引到底是什么?l.pdf

    69 更新数据的时候,自动维护的聚簇索引到底是什么?l.pdf

    数据库中聚簇索引与非聚簇索引的区别[图文]

    在《数据库原理》里面,对聚簇索引的解释是:聚簇索引的顺序就是数据的物理存储顺序,而对非聚簇索引的解释是:索引顺序与数据物理排列顺序无关。正式因为如此,所以一个表最多只能有一个聚簇索引。 不过这个定义太...

    聚簇索引与主键的选择

    聚簇索引与主键的选择一、什么是聚簇索引?二、什么是非聚簇索引?1. InnoDB引擎中2. MyISAM引擎中三、聚簇索引的优劣与主键选择的关系 一、什么是聚簇索引? 首先,聚簇索引不是一种单独的索引类型,其实是数据的...

    MySQL 聚簇索引.rar

    MySQL 聚簇索引.rar

    mysql索引原理之聚簇索引1

    2、聚簇索引 3、读内存和读磁盘 4、检索性能分析 5、其他索引式

    MySQL学习教程之聚簇索引

    聚簇,其实是相对于InnoDB这个数据库引擎来说的,因此在将聚簇索引的时候,我们通过InnoDB和MyISAM这两个MySQL的数据库引擎展开。 InnoDB和MyISAM的数据分布对比 CREATE TABLE test (col1 int NOT NULL, col2 int ...

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

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

    行业-69 更新数据的时候,自动维护的聚簇索引到底是什么?l.rar

    行业-69 更新数据的时候,自动维护的聚簇索引到底是什么?l.rar

    mysql聚簇索引的页分裂原理实例分析

    本文实例讲述了mysql聚簇索引的页分裂。分享给大家供大家参考,具体如下: 在MySQL中,MyISAM采用的是非聚簇索引的,InnoDB存储引擎是采用聚簇索引的。 聚簇结构的特点: 根据主键查询条目时,不用回行(数据就在主键...

    B+树聚簇索引 精讲开发培训

    索引,可能让好很多人望而生畏,毕竟每次面试时候 MySQL 的索引一定是必问内容,哪怕先撇开面试,就在平常的开发中,对于 SQL 的优化也而是重中之重。 可以毫不夸张的说,系统中 SQL 的好坏,是能直接决定你系统的...

    关于SQL Server中索引使用及维护简介

    聚簇索引的索引页面指针指向数据页面,所以使用聚簇索引查找数据几乎总是比使用非聚簇索引快。每张表只能建一个聚簇索引,并且建聚簇索引需要至少相当该表 120%的附加空间,以存放该表的副本和索引中间页。 SQL ...

    建立合理的索引提高SQL Server的性能

    由于聚簇索引的索引页面指针指向数据页面,所以使用聚簇索引查找数据几乎总是比使 用非聚簇索引快。每张表只能建一个聚簇索引,并且建聚簇索引需要至少相当该表120%的附加空间,以存放该表的副本和索引中间页。SQL ...

    数据库 索引及优化

    数据库 索引 优化 数据库索引好比是一本...索引分为聚簇索引和非聚簇索引两种,聚簇索引 是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。

    MySQL 的覆盖索引与回表的使用方法

    InnoDB的聚簇索引的叶子节点存储的是行记录(其实是页结构,一个页包含多行数据),InnoDB必须要有至少一个聚簇索引。 由此可见,使用聚簇索引查询会很快,因为可以直接定位到行记录。 普通索引 普通索引也叫二级...

    MySQL小面试题!!!!!

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

    最新150道MySQL大厂面试题课程

    005.聚簇索引与非聚簇索引b+树实现有什么区别? 006.说一下B+树中聚簇索引的查找(匹配)逻辑 007.说一下B+树中非聚簇索引的查找(匹配)逻辑 008.平衡二叉树,红黑树,B树和B+树的区别是什么?都有哪些应用场景? ...

Global site tag (gtag.js) - Google Analytics