【云驻共创】深入理解GaussDB(for MySQL)数据库中的文件组织与索引

从大数据到人工智能 发表于 2022/04/28 18:15:15 2022/04/28
【摘要】 GaussDB(for MySQL)是华为自研的最新一代高性能企业级分布式关系型数据库,完全兼容MySQL。文件组织与索引方式作为数据库性能重要指标,本文从其基本概念入手,讲述文件组织与索引的一般概念,进而分析并展示其在GaussDB(for MySQL)中的应用。

摘要:GaussDB(for MySQL)是华为自研的最新一代高性能企业级分布式关系型数据库,完全兼容MySQL。文件组织与索引方式作为数据库性能重要指标,本文从其基本概念入手,讲述文件组织与索引的一般概念,进而分析并展示其在GaussDB(for MySQL)中的应用。

1. 文件组织

在了解数据以文件的形式存储之前,我们有必要先了解什么是文件组织。文件组织就是当文件存储在磁盘上时,组织文件中的记录所使用的方法,其组织的方式和方法制约着数据的存储与访问效率。我们知道数据库是将数据存储在外部存储器中的,计算时需要将数据加载到内存后处理,不同的DBMS在读取方式上也是几乎迥异。所以每一个文件组织都会为某些操作的效率提高而想尽方法,但同时也消耗其他操作的性能。通过访问层代码,可以创建、删除文件,向其中插入或者删除记录。还可以进行查询操作,以一次访问一个记录的方式来遍历文件上的所有记录。文件层将文件中的记录存储于一组磁盘页,并且跟踪分配给每一个文件的所有页以及页的可用空间。

无序文件是最简单的文件组织方式,也就是说文件的数据在文件页中以任意的顺序排列,每一个记录有一个唯一标识符,rID,访问者可通过rID检索到某一条特定的记录。该种文件组织方法要求文件管理器必须跟踪分配给文件的所有页面,处理数据时将数据读入内存,而同时为了持久存储,还需要将数据写回磁盘,上述操作都是由称为缓冲区管理器的软件层实现的。当文件层需要处理某一页数据时,向缓冲区管理器取出该页,并指定rID,而如果所请求的页面不在内存中,则将数据从磁盘读入内存。磁盘上的空间是由磁盘空间管理器负责的,当文件层需要额外磁盘空间保存新记录时,它就会请求磁盘空间管理器分配一个新的页面以保存数据。当文件不再需要该磁盘页时,他也会通过磁盘空间管理器释放该空间。

2. 什么是索引

索引是一种为了提高数据检索性能而采用的技术,在磁盘上组织数据记录的一种数据结构,以优化某类数据检索的操作。其具有如下特点:

索引时在保重的字段基础上建立的一种数据库对象,由数据库管理员或表的拥有者负责创建和撤销,而其他用户不能随意创建和撤销。

索引的创建和撤销对表本身不产生任何影响。

索引由系统自动选择和维护。

我们知道在一般情况下,表中记录的顺序是由数据的输入顺序来决定的,并由记录号标识,除非有记录的插入或删除,否则其顺序总是保持不变的。如果创建了一个索引(非聚簇索引),便建立一个专门存放索引项的结构,该结构中保存索引项的逻辑顺序,并且记录指针指向的物理记录。此时,表的存储部分便由两个部分组成,一部分用于存储表的数据页面,另一部分则是用于存放索引页面。

索引页面相对于数据页面是小得多的,在数据查询时,首先搜索索引页面,从中找到所需数据的指针,然后再通过该指针在数据页面找到读取的数据。很明显,当数据表规模较为庞大时,如果我们为该表建立了索引,那么我们就可以通过高效的查找算法找到该索引项,进而通过指针快速找到需要查找的数据,索引在很大程度上提高数据库的查询性能。

3. 索引的创建原则

缺少索引或者对索引创建不合理,都会对数据库性能产生影响。创建索引具有如下原则和方法:

创建索引由专人完成。专人指的是数据库管理员或表的管理者,专人根据应用环境的需要在数据库中建立一个或多个索引,其他用户是无权创建和撤销索引的。

创建索引要取决于表的数据量。一般来收,基本表中记录的数据量越多,数据量越长,我们是越有必要建立索引的。同时,对于查询的频率高,实时性强的表,我们也是要建立索引的。

索引数量要适度。索引文件本身会占用文件目录和存储空间。索引过多会加重系统负担,索引本身也需要维护,当基本表的数据进行调整时,也要对索引进行调整和更新,从而保证和基本表一致,所以如果索引过多,也会影像数据增删改的速度。

3.1. 哪些情况下应该避免使用索引

包含太多重复值的字段

查询中很少被引用的字段

值特别长的字段

查询返回率特别高的字段

具有很多空值的字段

需要经常插、、改的字段

记录较少的基本表

需要进行频繁、大批量数据更新的基本表

4. 索引的类型与创建方法

索引的类型根据数据库的功能决定,由DBA或表的拥有者负责创建和撤销。通常索引分为聚簇索引、非聚簇索引、普通索引以及唯一索引四种类型。普通索引是GaussDB(for MySQL)的基本索引类型,允许在定义索引的列中插入重复值和空值。而唯一索引的列值必须是唯一的,但允许有空值,如果是组合索引,则列值的组合必须唯一,一个表是可以建立多个唯一索引的;主索引是一种特殊的唯一索引,一个表知能有一个主索引,而不允许有空值。

4.1. 三种在GaussDBfor MySQL)中创建普通索引的方法

直接创建普通索引

CREATE INDEX index_name ON table(column_name)

具体来说,在GaussDB(for MySQL)管理控制台的操作如下:

修改表结构同时创建普通索引

ALTER TABLE table_name ADD INDEX index_name(column_name)

具体来说,在GaussDB(for MySQL)管理控制台的操作如下:

创建表同时创建普通索引

CREATE TABLE <column_name><type 1> NOT NULL | NULL, ......
<column_name><type n> NOT NULL|NULL,
PRIMARY_KEY(column_name),
INDEX index_name(column_name);

具体来说,在GaussDB(for MySQL)管理控制台的操作如下:

4.2. GaussDBfor MySQL)中创建唯一索引

而唯一索引的创建方式与普通索引的创建方式是类似的,只需要在INDEX前加上UNIQUE参数即可。而需要注意的是,唯一索引要求索引列的取值是唯一的,具体如下图所示:

根据索引的列数,我们还可以将索引分为单列索引和组合索引。具体如下图所示:

创建组合索引

CREATE INDEX index_name ON table(column_name1, column_name2)

具体来说,在GaussDB(for MySQL)管理控制台的操作如下:

5. 如何在GaussDBfor MySQL)查看与删除索引

查看索引基本命令:

SHOW INDEX FROM [database_name].table_name

具体来说,在GaussDB(for MySQL)管理控制台的操作如下:

索引与数据库对象不同,它可以根据需要随时创建,也可以将不需要的索引进行删除,从而减少资源的占有量。删除索引有两种方式,基本方式为:

DROP INDEX index_name on table_name

具体来说,在GaussDB(for MySQL)管理控制台的操作如下:

还可以修改表结构时删除索引:

ALTER TABLE table_name DROP INDEX index_name

具体来说,在GaussDB(for MySQL)管理控制台的操作如下:

6. 总结

本文分析了数据库系统中文件组织与索引的一般概念,并介绍了GaussDB(for MySQL)数据库的索引类型及其创建、删除、查询等方法。由于GaussDB对MySQL语法的兼容特性,极大降低了用户的学习成本,做到轻松上手。通过本文,更加深入了解GaussDB(for MySQL)的索引使用机制,相信通过本文,用户可更快更高效地在工作中使用GaussDB(for MySQL)的索引。

7. 参考资料

本文整理自华为云社区【内容共创】活动第15期。

https://bbs.huaweicloud.com/blogs/345822

任务23华为云数据库之文件组织与索引


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。