数据表的索引
在介绍索引之前,我们需要先对数据 库提取数据的逻辑,建立一个基本的了解,这样才可以帮助我们了解到,索引究竟是解决了什么方面的问题,以及如何安排索引。
PostgreSQL 提取数据的逻辑:由数据表构造数据表
经过前面部分的学习,我们已经对关系型数据库的理论基础与基本实践,建立了一个基本的了解,可以看到,PostgreSQL 习惯于将数据组织成一张张形式各异的数据表加以管理,并且根据我们的查询请求,提取对应的数据行,并加以返回,整体的逻辑可以描述为如下的图片:
(从某种意义上面而言,这是一个使用既有数据表数据组合新数据表的过程)
举例来说,假定存在数据表 AtomGit_Issues 用于描述我们提报给 AtomGit 的 Issue 数据,如下所示:
CREATE TABLE "AtomGit_Issues" (
title TEXT, /* 用于描述 Issue 的标题 */
content TEXT, /* 用于存储 Issue 的内容 */
author TEXT, /* 用于存储创建用户的名称 */
labels TEXT[], /* 用于存储 Issue 所对应的标签 */
status INTEGER, /* 用于描述 Issue 的状态(开启/关闭) */
id INTEGER, /* 用于存储 Issue 的 ID */
add_time DATE DEFAULT CURRENT_DATE /* 存储创建 Issue 的时间 */
);
可以使用数组在同一列中存储多个元素
对于类似于 "#C语言 #PostgreSQL #SQL" 这样的一个个标签形式的数据,PostgreSQL 提供了数组,以便我们将它们存储在同一个数据列之中。
对于存在大写字母的数据表名称等,对名称加上 "" 更为合适
在没 有书写 "" 包裹字符串时,PostgreSQL 会将 CREATE TABLE 的数据表名中的大写字母转换为小写,如我们书写 CREATE TABLE Books 时,将会与 CREATE TABLE books 等价(但是如果我们打上 CREATE TABLE "Books",将不会存在这个问题)。
在不注意到这个特性的情况下,将会造成许多奇怪的情况,因此必须留心。
之后,我们可能会按照某种条件,搜索这张数据表中的数据,如图所示:
可以发现,最终呈现的结果数据,从某种意义上来说,实际上就是 Issue 数据表的一个子集,因此,如果我们可以设法提升构造结果表的速度的话(提升查询的速度),我们自然而然地也就能够缩短整体流程的时间,进而能够带来更好的用户体验。
索引就是我们可以选择采取的一种手段,它会按照我们的要求,采取一定的策略,将整体的数据表中的数据,提炼成更小的数据片段,进而提升查询的速率,最后缩短流程所需要的时间(小数据片段的读写效率往往高于大数据片段)。
(索引从某种意义上面看,就是被精心挑选出来的数据列,用以在某种途径上面帮助我们更快地找到我们所需要的信息)