一般状况下,创建索引是加快查询速度的有效手段。但索引不是万能的,靠索 引并不能实现对全部数据的快速存取。事实上,若是索引策略和数据检索需求严重不符的话,创建索引反而会下降查询性能。所以在实际使用当中,应该充分考虑到 索引的开销,包括磁盘空间的开销及处理开销(如资源竞争和加锁)。例如,若是数据频繁的更新或删加,就不宜创建索引。算法
二、从表中删除数据行数据库
对删除数据行来讲:删除行将致使其下方的数据行向上移动以填充删除记录形成的空白。若是删除的行是该数据页中的最后一行,那么该数据页将被回收,相应的索 引页中的记录将被删除。对于数据的删除操做,可能致使索引页中仅有一条记录,这时,该记录可能会被移至邻近的索引页中,原索引页将被回收,即所谓的“索引 合并”。ide
不知从什么角度来对比,只能说说各自的特色,但愿对你有用。
一、聚簇索引
a) 一个索引项直接对应实际数据记录的存储页,可谓“直达”
b) 主键缺省使用它
c) 索引项的排序和数据行的存储排序彻底一致,利用这一点,想修改数据的存储顺序,能够经过改变主键的方法(撤销原有主键,另找也能知足主键要求的一个字段或一组字段,重建主键)
d) 一个表只能有一个聚簇索引(理由:数据一旦存储,顺序只能有一种)
二、非聚簇索引
a) 不能“直达”,可能链式地访问多级页表后,才能定位到数据页
b) 一个表能够有多个非聚簇索引
第二种理解:
聚簇索引是对磁盘上实际数据从新组织以按指定的一个或多个列的值排序的算法。特色是存储数据的顺序和索引顺序一致。
通常状况下主键会默认建立聚簇索引,且一张表只容许存在一个聚簇索引。布局
在《数据库原理》一书中是这么解释聚簇索引和非聚簇索引的区别的:
聚簇索引的叶子节点就是数据节点,而非聚簇索引的叶子节点仍然是索引节点,只不过有指向对应数据块的指针。性能
所以,MYSQL中不一样的数据存储引擎对聚簇索引的支持不一样就很好解释了。
下面,咱们能够看一下MYSQL中MYISAM和INNODB两种引擎的索引结构。spa
如原始数据为:
MyISAM引擎的数据存储方式如图:
指针
MYISAM是按列值与行号来组织索引的。它的叶子节点中保存的其实是指向存放数据的物理块的指针。
从MYISAM存储的物理文件咱们能看出,MYISAM引擎的索引文件(.MYI)和数据文件(.MYD)是相互独立的。orm
而InnoDB按聚簇索引的形式存储数据,因此它的数据布局有着很大的不一样。它存储数据的结构大体以下:
注:聚簇索引中的每一个叶子节点包含主键值、事务ID、回滚指针(rollback pointer用于事务和MVCC)和余下的列(如col2)。htm
INNODB的二级索引与主键索引有很大的不一样。InnoDB的二级索引的叶子包含主键值,而不是行指针(row pointers),这减少了移动数据或者数据页面分裂时维护二级索引的开销,由于InnoDB不须要更新索引的行指针。其结构大体以下:
排序
INNODB和MYISAM的主键索引与二级索引的对比:
InnoDB的的二级索引的叶子节点存放的是KEY字段加主键值。所以,经过二级索引查询首先查到是主键值,而后InnoDB再根据查到的主键值经过主键 索引找到相应的数据块。而MyISAM的二级索引叶子节点存放的仍是列值与行号的组合,叶子节点中保存的是数据的物理地址。因此能够看出MYISAM的主 键索引和二级索引没有任何区别,主键索引仅仅只是一个叫作PRIMARY的惟1、非空的索引,且MYISAM引擎中能够不设主键