`
y806839048
  • 浏览: 1119144 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

聚簇索引和非聚簇索引的区别(myisam和innodb)

阅读更多

总结:

聚簇索引

  按照索引列排序,整行数据和索引在一起,索引列可以是单列还可以是组合列,默认是主键上聚簇索引,改变聚簇索引键可以改变数据存的物理顺序,

   一张表一个聚簇索引   ---范围查询且输出的数据列多时用

   建立索引的列可以新增,不要经常修改,新增需改就更新索引

        范围查找还是范围查找只不过自动顺序获取,不必再寻道

 

非聚簇索引:

   索引只存数据页的指针地址,索引顺序和数据存储数据无关

 

 

myisam:用的非聚簇索引,表级锁,不支持事物,查询(直接由地址到数据),插入效率高,

 

innodb:用的聚簇索引,行级锁,支持事物,查询(需要维护缓存块,再由缓存块到数据),插入(需要数据物理位置重拍)效率低

 

具体:

通常情况下,建立索引是加快查询速度的有效手段。但索引不是万能的,靠索 引并不能实现对所有数据的快速存取。事实上,如果索引策略和数据检索需求严重不符的话,建立索引反而会降低查询性能。因此在实际使用当中,应该充分考虑到 索引的开销,包括磁盘空间的开销及处理开销(如资源竞争和加锁)。例如,如果数据频繁的更新或删加,就不宜建立索引。

    本文简要讨论一下聚簇索引的特点及其与非聚簇索引的区别。
  • 建立索引:
在SQL语言中,建立聚簇索引使用CREATE INDEX语句,格式为:CREATE CLUSTER INDEX index_name ON table_name(column_name1,column_name2,...);
  • 存储特点:
  1. 聚集索引。表数据按照索引的顺序来存储的,也就是说索引项的顺序与表中记录的物理顺序一致。对于聚集索引,叶子结点即存储了真实的数据行,不再有另外单独的数据页。 在一张表上最多只能创建一个聚集索引,因为真实数据的物理顺序只能有一种。
  2. 非聚集索引。表数据存储顺序与索引顺序无关。对于非聚集索引,叶结点包含索引字段值及指向数据页数据行的逻辑指针,其行数量与数据表行数据量一致。
    总结一下:聚集索引是一种稀疏索引,数据页上一级的索引页存储的是页指针,而不是行指针。而对于非聚集索引,则是密集索引,在数据页的上一级索引页它为每一个数据行存储一条索引记录。
  • 更新表数据
1、向表中插入新数据行
    如果一张表没有聚集索引,那么它被称为“堆集”(Heap)。这样的表中的数据行没有特定的顺序,所有的新行将被添加到表的末尾位置。而建立了聚簇索引的数据表则不同:最简单的情况下,插入操作根据索引找到对应的数据页,然后通过挪动已有的记录为新数据腾出空间,最后插入数据。如果数据页已满,则需要拆分数据页,调整索引指针(且如果表还有非聚集索引,还需要更新这些索引指向新的数据页)。而类似于自增列为聚集索引的,数据库系统可能并不拆分数据页,而只是简单的新添数据页。

2、从表中删除数据行

    对删除数据行来说:删除行将导致其下方的数据行向上移动以填充删除记录造成的空白。如果删除的行是该数据页中的最后一行,那么该数据页将被回收,相应的索 引页中的记录将被删除。对于数据的删除操作,可能导致索引页中仅有一条记录,这时,该记录可能会被移至邻近的索引页中,原索引页将被回收,即所谓的“索引 合并”。

 

 

 

聚簇索引确定表中数据的物理顺序。聚簇索引类似于电话簿,后者按姓氏排列数据。由于聚簇索引规定数据在表中的物理存 储顺序,因此一个表只能包含一个聚簇索引。但该索引可以包含多个列(组合索引),就像电话簿按姓氏和名字进行组织一样。汉语字典也是聚簇索引的典型应用, 在汉语字典里,索引项是字母+声调,字典正文也是按照先字母再声调的顺序排列。

 

聚簇索引对于那些经常要搜索范围值的列特别有效。使用聚簇索引找到包含第一个值的行后,便可以确保包含后续索引值的行在物理相邻。例如,如果应用程序执行的一个查询经常检索某一日期范围内的记录,则使用聚集索引可以迅速找到包含开始日期的行,然后检索表中所有相邻的行,直到到达结束日期。这样有助于提高此类查询的性能。同样,如果对从表中检索的数据进行排序时经常要用到某一列,则可以将该表在该列上聚簇(物理排序),避免每次查询该列时都进行排序,从而节省成本。
 

建立聚簇索引的思想

1、大多数表都应该有聚簇索引或使用分区来降低对表尾页的竞争,在一个高事务的环境中,对最后一页的封锁严重影响系统的吞吐量。
2、在聚簇索引下,数据在物理上按顺序排在数据页上,重复值也排在一起,因而在那些包含范围检查 (between、<、<=、>、>=)或使用group by或orderby的查询时,一旦找到具有范围中第一个键值的行,具有后续索引值的行保证物理上毗连在一起而不必进一步搜索,避免了大范围扫描,可以大 大提高查询速度。
3、在一个频繁发生插入操作的表上建立聚簇索引时,不要建在具有单调上升值的列(如IDENTITY)上,否则会经常引起封锁冲突。
4、在聚簇索引中不要包含经常修改的列,因为码值修改后,数据行必须移动到新的位置。
5、选择聚簇索引应基于where子句和连接操作的类型。
 
不知从什么角度来对比,只能说说各自的特点,希望对你有用。
1、聚簇索引
a) 一个索引项直接对应实际数据记录的存储页,可谓“直达”
b) 主键缺省使用它
c) 索引项的排序和数据行的存储排序完全一致,利用这一点,想修改数据的存储顺序,可以通过改变主键的方法(撤销原有主键,另找也能满足主键要求的一个字段或一组字段,重建主键)
d) 一个表只能有一个聚簇索引(理由:数据一旦存储,顺序只能有一种)

2、非聚簇索引
a) 不能“直达”,可能链式地访问多级页表后,才能定位到数据页
b) 一个表可以有多个非聚簇索引





第二种理解:

聚簇索引是对磁盘上实际数据重新组织以按指定的一个或多个列的值排序的算法。特点是存储数据的顺序和索引顺序一致。
一般情况下主键会默认创建聚簇索引,且一张表只允许存在一个聚簇索引。

在《数据库原理》一书中是这么解释聚簇索引和非聚簇索引的区别的:
聚簇索引的叶子节点就是数据节点,而非聚簇索引的叶子节点仍然是索引节点,只不过有指向对应数据块的指针。

因此,MYSQL中不同的数据存储引擎对聚簇索引的支持不同就很好解释了。
下面,我们可以看一下MYSQL中MYISAM和INNODB两种引擎的索引结构。

如原始数据为:

MyISAM引擎的数据存储方式如图:

MYISAM是按列值与行号来组织索引的。它的叶子节点中保存的实际上是指向存放数据的物理块的指针。
从MYISAM存储的物理文件我们能看出,MYISAM引擎的索引文件(.MYI)和数据文件(.MYD)是相互独立的。

而InnoDB按聚簇索引的形式存储数据,所以它的数据布局有着很大的不同。它存储数据的结构大致如下:

注:聚簇索引中的每个叶子节点包含主键值、事务ID、回滚指针(rollback pointer用于事务和MVCC)和余下的列(如col2)。

INNODB的二级索引与主键索引有很大的不同。InnoDB的二级索引的叶子包含主键值,而不是行指针(row pointers),这减小了移动数据或者数据页面分裂时维护二级索引的开销,因为InnoDB不需要更新索引的行指针。其结构大致如下:

INNODB和MYISAM的主键索引与二级索引的对比:

InnoDB的的二级索引的叶子节点存放的是KEY字段加主键值。因此,通过二级索引查询首先查到是主键值,然后InnoDB再根据查到的主键值通过主键
索引找到相应的数据块。而MyISAM的二级索引叶子节点存放的还是列值与行号的组合,叶子节点中保存的是数据的物理地址。所以可以看出MYISAM的主
键索引和二级索引没有任何区别,主键索引仅仅只是一个叫做PRIMARY的唯一、非空的索引,且MYISAM引擎中可以不设主键

 

 

分享到:
评论

相关推荐

    mysql索引原理之聚簇索引1

    索引分为聚簇索引(Clustered Index)和非聚簇索引(Secondary Index)。聚簇索引决定了数据行在磁盘上的物理存储顺序,而非聚簇索引则不遵循这种顺序。 1、MySQL的索引: 在MySQL中,不同的存储引擎对索引的实现...

    MySQL Innodb 索引原理详解

    - **非聚簇索引**:非主键索引是非聚簇索引,它们并不决定表中数据的物理存储顺序。 ##### 2.4 插入与删除 - **插入操作**:当向B+树中插入新的关键字时,如果当前节点已满,则需要进行分裂操作。B+树的分裂操作只...

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

    从物理文件也可以看出 InnoDB(聚集索引)的数据文件只有数据结构文件.frm和数据文件.idb 其中.idb中存放的是数据和索引信息 是存放在一起的。 2、非聚集索引 表数据存储顺序与索引顺序无关。对于非聚集索引,叶结点...

    MySQL存储引擎中MyISAM和InnoDB区别详解

    - **InnoDB** 使用B+树结构存储索引,支持聚簇索引(数据和索引存储在一起)和非聚簇索引,支持行级锁定,提升并发性能。 - **MyISAM** 也使用B+树,但索引和数据分开存储,只支持非聚簇索引。它的全文索引支持...

    MySQL索引1

    正确地设计和使用聚簇索引、非聚簇索引、覆盖索引以及各种类型的特殊索引,可以帮助我们构建高效、响应快速的数据库系统。在实践中,应根据具体业务需求和数据特性来选择最合适的索引类型和结构。

    mysql索引和锁机制ppt介绍

    - 例子:查找字典中的某个字时,先查目录(非聚簇索引),再根据页码找到该字的位置(实际数据行)。 #### 四、InnoDB存储引擎特性 **InnoDB主键索引:** - InnoDB默认使用聚簇索引作为主键索引。 - 主键索引的结构...

    数据库优化实战利器.pdf

    在MyISAM存储引擎中,数据和索引是分开存放的,因此它只支持非聚簇索引。非聚簇索引的优点在于数据插入时不需要考虑顺序问题,插入速度可能更快。但是,当查询涉及到非主键字段时,需要先通过非聚簇索引找到主键,再...

    Mysql 的存储引擎,myisam和innodb的区别

    在索引方面,InnoDB支持聚簇索引(数据本身存储在索引中),而MyISAM使用非聚簇索引,数据和索引分开存储。这使得InnoDB在处理复杂查询时可能更为高效,但在某些特定的全文索引和统计查询上,MyISAM可能更胜一筹。 ...

    2021年数据库秋招面试题常考_数据库考试选择题

    聚簇索引和非聚簇索引的区别在于数据的物理存储方式不同。聚簇索引的叶子节点是数据本身,因此一个表只能有一个聚簇索引;非聚簇索引的叶子节点存储的是数据的引用。InnoDB引擎使用的是聚簇索引,MyISAM引擎使用的...

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

    在InnoDB存储引擎中,聚簇索引是默认的索引类型,而MyISAM则使用非聚簇索引。聚簇索引对于主键查询具有显著优势,因为数据行实际存储在主键的索引页中,这意味着查找主键值时,不需要额外的“回行”操作来获取相关...

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

    - **非聚簇索引**:只存储索引和指向实际数据的指针,适合多字段联合查询。 #### 结语 以上是对MySQL大厂面试题课程的部分内容的概要总结,涵盖了索引机制的核心知识点。理解这些基本概念有助于更好地掌握MySQL的...

    Java初级、中级、高级面试题及答案

    事务\事务隔离级别\Mysql默认隔离级别\串行化\存储引擎Innodb\Myisam\Inodb锁机制\MVCC\B树索引\哈希索引\聚簇索引\非聚簇索引\回表查询和覆盖索引\Explain语句\SQL语句的执行过程\范式\聚合函数\SQL优化\HTTP\多态\...

    mysql面试题 mysql高级面试题 mysql面试题完整

    InnoDB默认使用聚簇索引,数据存储在索引中,MyISAM使用非聚簇索引,数据和索引分开存储。 3. **B+树查找逻辑**:在B+树中,聚簇索引的查找是直接找到数据,而非聚簇索引查找需要通过指针找到对应的聚簇索引页来...

    索引类型FULLTEXT,HASH,BTREE,RTREE,索引优化1

    例如,MyISAM 存储引擎使用 B+Tree,叶子节点存储数据记录的地址,形成非聚簇索引,主索引与辅助索引的区别仅在于主键不能有重复值。相反,InnoDB 使用聚簇索引,其中叶子节点直接包含数据记录,一个表只有一个聚簇...

    MySQL数据库应用实战教程 第7章教案 索引.docx

    例如,MyISAM使用非聚簇索引,而InnoDB则采用聚簇索引,这直接影响了它们的查询性能和数据存储方式。 然后,我们会深入探讨索引的应用,包括如何创建表并添加索引,使用`EXPLAIN`分析查询计划以检查索引的使用,...

    MySQL数据库应用实战教程 第7章教案 索引.pdf

    MyISAM使用非聚簇索引,数据和索引分开存储;InnoDB使用聚簇索引,索引和数据在同一个结构中;MEMORY存储引擎的索引基于内存,速度极快但数据不持久化。 索引的应用部分,讲解了如何在创建表时添加索引,以及如何...

    数据库+框架.docx(粗讲)

    InnoDB使用聚簇索引,数据存储在主键索引的叶子节点上,而MyISAM使用非聚簇索引,需二次查询获取数据。此外,InnoDB的行锁设计允许更高的并发,而MyISAM使用表锁,意味着在并发环境下性能可能会下降。 关于自增主键...

    150道mysql面试题汇总.doc

    InnoDB存储引擎的索引支持聚簇索引和非聚簇索引,MyISAM只支持非聚簇索引。 2. **B+树索引原理**:B+树是一种平衡多路搜索树,所有叶子节点在同一层,非叶子节点只存储索引,不存储数据,便于快速查找。聚簇索引将...

    mysql面试题,包含面经文档、技术要点或面试编程题等

    3. 聚簇索引与非聚簇索引:聚簇索引的索引项和数据行存储在一起,而非聚簇索引索引项指向数据行的位置。InnoDB的主键是聚簇索引,其他索引是非聚簇索引。 4. 索引优化:定期检查索引使用情况,删除无用索引,创建...

Global site tag (gtag.js) - Google Analytics