1700509385
1700509386
1700509387
1700509388
1700509390
数据科学家养成手册 13.5 表分区和索引
1700509391
1700509392
为了提高检索效率,有时需要建立表分区和索引。
1700509393
1700509394
索引大家应该不会陌生,在OLTP环境中就经常使用它。索引的好处是检索的时候能够有效避开很多不必要的数据块扫描,坏处是在进行数据插入、更新、删除的时候需要重新对索引进行维护,这是一笔时间开销。常见的索引有B-Tree索引、Hash索引、Bitmap索引,它们都能在不同的场合加快检索速度,但是通常也有各自的局限性。
1700509395
1700509396
在OLTP环境中,只要索引设计合理,通常都能够加快检索速度,同时降低一定的更新速度。而在OLAP环境中,在实践过程中我们可能会感受到,在很多场合,索引对检索的加速效果不明显。
1700509397
1700509399
13.5.1 表分区
1700509400
1700509401
表分区在OLAP环境中通常会建立在时间字段上(也可以建立在其他字段上),将这个字段作为分区键(Partitioning Key)。如果分区键是有序类型的,通常SQL查询语句会在一个where谓词对分区键作出取值限制后忽略扫描不涉及的分区,在查询SQL语句没有做任何特殊优化的情况下,把查询效率提高n倍(n为分区个数,且分区尺寸大小相近)。
1700509402
1700509403
如图13-8所示,如果在一个历史数据表中按照年和月来划分分区,那么当一个SQL语句指定为时,扫描内容会限定在“2012-12”这个分区中,其余的分区表及其中的索引不会被扫描。
1700509404
1700509405
1700509406
1700509407
1700509408
图13-8 表分区示意图
1700509409
1700509410
SELECT ……WHERE DATETIME=‘2012-12’;
1700509411
1700509412
当然,如果分区非常不均匀,例如“2012-12”分区中的字段有100万条记录,而“2012-1”至“2012-11”分区中各有1万条记录,则效率的提升理论上仅仅是从扫描111万条数据减少到扫描100万条数据,效率提高了9.9%。所以,分区表推荐用在基于分区键扫描、非跨区扫描且分区相对均匀的场景。
1700509413
1700509415
13.5.2 索引
1700509416
1700509417
索引是一种非常有效的加快检索的辅助功能。
1700509418
1700509419
像《新华字典》里的索引一样,数据库中的索引都包含两部分信息,一部分是检索键的信息,另一部分是地址信息。检索键的信息是对检索内容的描述,而地址信息是对最终存储数据位置的物理地址的描述。
1700509420
1700509421
1.B-TREE索引
1700509422
1700509423
B-TREE索引是一种在关系型数据库中常用的索引,从“上”到“下”构造了一棵树的结构。树的“叶子”节点就是真实的数据块,树的“枝”节点用来记录数据中建立索引的字段的取值范围(如图13-9所示)。查找过程中,在SQL查询语句中用where谓词对索引字段进行了相应的限制后(例如使用“=”进行限制),就不再进行全表或者全分区范围内的查找了,而是从“根”节点到某一“枝”节点再到某一“叶子”节点逐步深入地查找,同时避开那些根本没有必要扫描的数据块或者索引块,从而降低I/O成本。请注意,它的本质是使用二分查找算法,在整个数据集熵最大的情况下,工作效率的提升程度最高。
1700509424
1700509425
1700509426
1700509427
1700509428
图13-9 B-TREE索引
1700509429
1700509430
索引在带来便利的同时,也需要付出相应的代价。一方面,索引属于信息冗余性描述,所以肯定会占用相应的磁盘空间。按照索引构建的规则来看,应该会占用2倍的索引键空间。另一方面,为了起到加速检索的作用,索引必须与表数据保持一致,也就是说,表中每加入一条数据,索引就需要重新进行一次计算和调整以保持内容信息、地址指针信息与数据表一致,而这些操作也需要消耗I/O和CPU资源。
1700509431
1700509432
2.BITMAP索引
1700509433
1700509434
在索引键的内容高度重复的情况下,例如索引内容是“男、女”、“东、西、南、北”、“S、M、L、XL、XXL”等枚举值,B-TREE索引通常无法起到加速作用。我们知道,B-TREE索引的基本思想是数据结构中的二分查找思想,而对于这种高度重复的数据是无法通过这种方式查找且每次都避开剩余数据中的一半数据的。那么,应该如何加速呢?“Bitmap索引”(位图索引)可以提供相应的功能。
[
上一页 ]
[ :1.700509385e+09 ]
[
下一页 ]