索引和聚簇浅析
文章目录
存取方法
存取方法是快速存取数据库中数据的技术。数据库管理系统一般提供多种存取方法。常用的存取方法为索引方法和聚簇(clustering)方法。
S+树索引和hash索引是数据库中经典的存取方法,使用最普遍。
聚簇
为了提高某个属性(或属性组)的查询速度,把这个或这些属性上具有相同值的元组 集中存放在连续的物理块中称为聚簇。该属性(或属性组)称为聚簇码(clusterkey)。聚簇功能可以大大提高按聚簇码进行查询的效率。
例如,要查询信息系的所有学生名单,设信息系有500名学生,在极端情况下,这500名学生所对应的数据元组分布在500个不同的物理块上。尽管对学生关系已按所在系建有索引,由索引很快找到信息系学生的元组标识,避免了全表扫描,然而在由元组标识去访问数据块时就要存取500个物理块,执行500次I/O操作。如果将同一系的学生元组集中存放,则每读一个物理块可得到多个满足查询条件的元组,从而显著地减少了访问磁盘的次数。
一个数据库可以建立多个聚簇,一个关系只能加入一个聚簇。选择聚簇存取方法,即 确定需要建立多少个聚簇,每个聚簇中包括哪些关系.
首先设计候选聚簇,一般来说:
- 对经常在一起进行连接操作的关系可以建立聚簇。
- 如果一个关系的一组属性经常出现在相等比较条件中,则该单个关系可建立聚族。
- 如果一个关系的一个(或一组)属性上的值重复率很高,则此单个关系可建立聚 簇。即对应每个聚簇码值的平均元组数不能太少,太少则聚簇的效果不明显。
然后检查候选聚簇中的关系,取消其中不必要的关系。
- 从聚簇中删除经常进行全表扫描的关系。
- 从聚簇中删除更新操作远多于连接操作的关系。
- 不同的聚簇中可能包含相同的关系,一个关系可以在某一个聚簇中,但不能同时加入多个聚簇。要从这多个聚簇方案(包括不建立聚簇)中选择一个较优的,即在这个聚簇上运行各种事务的总代价最小。
必须强调的是,聚簇只能提高某些应用的性能,而且建立与维护聚簇的开销是相当大的。对已有关系建立聚簇将导致关系中元组移动其物理存储位置,并使此关系上原来建立的所有索引无效,必须重建。当一个元组的聚簇码值改变时,该元组的存储位置也要做相应移动,聚簇码值要相对稳定,以减少修改聚簇码值所引起的维护开销。
因此,当通过聚簇码进行访问或连接是该关系的主要应用,与聚簇码无关的其他访问很少或者是次要的,这时可以使用聚簇。尤其当SQL语句中包含有与聚簇码有关的ORDERBY、GROUP BY、UNION、DISTINCT等子句或短语时,使用聚簇特别有利,可以省去对结果集的排序操作;否则很可能会适得其反。
索引
索引用于快速找出在某个列中有一特定值的行。对相关列使用索引是 高 SELECT 操作 性能的最佳途径。
查询要使用索引最主要的条件是查询条件中需要使用索引关键字,如果是多列索引,那么只有查询条件使用了多列关键字最左边的前缀时,才可以使用索引,否则将不能使用索引。
分类
索引是在MySQL的存储引擎层中实现的,而不是在服务器层实现的.所以每种存储引擎的索引都不一定完全相同,也不是所有的存储引擎都支持所有的索引类型.MySQL目前提供了以下4种引擎.
- B-Tree索引:最常见的索引类型,大部分引擎都支持B树索引.
- HASH索引:只有Memory引擎支持,使用场景简单.
- R-Tree索引(空间索引):空间索引是MyISAM的一种特殊索引类型,主要用于地理空间数据类型,通常使用较少.
- Full-text(全文索引):全文索引也是MyISAM的一个特殊索引类型,主要用于全文索引.
1. B树索引存取方法的选择
所谓选择索引存取方法,实际上就是根据应用要求确定对关系的哪些属性列建立索 引、哪些属性列建立组合索引、哪些索引要设计为唯一索引等。一般来说:
(1) 如果一个(或一组)属性经常在查询条件中出现,则考虑在这个(或这组)属性 上建立索引(或组合索引)。
(2) 如果一个属性经常作为最大值和最小值等聚集函数的参数,则考虑在这个属性上 建立索引。
(3) 如果一个(或一组)属性经常在连接操作的连接条件中出现,则考虑在这个(或 这组)属性上建立索引。
关系上定义的索引数并不是越多越好,系统为维护索引要付出代价,査找索引也要付 出代价。例如,若一个关系的更新频率很高,这个关系上定义的索引数不能太多。因为更 新一个关系时,必须对这个关系上有关的索引做相应的修改。
2. hash索引存取方法的选择
选择hash存取方法的规则如下:如果一个关系的属性主要出现在等值连接条件中或主要出现在等值比较选择条件中,而且满足下列两个条件之一,则此关系可以选择hash存取方法。
(1) 一个关系的大小可预知,而且不变。
(2) 关系的大小动态改变,但数据库管理系统提供了动态hash存取方法。
文章作者 Forz
上次更新 2017-08-15