云数据库GaussDB索引常见问题解答

云数据库GaussDB索引常见问题解答

  • 什么是GaussDB索引?

    索引是为了加速对表中数据行的检索而创建的一种分散的存储结构。

    索引是针对表而建立的,它是由数据页面以外的索引页面组成的,每个索引页面中的行都会含有逻辑指针,以便加速检索物理数据。 

    在数据库关系图中,可以在选定表的“索引/键”属性页中创建、编辑或删除每个索引类型。当保存索引所附加到的表,或保存该表所在的关系图时,索引将保存在数据库中。

  • 索引的作用

    (1)快速取数据;

    (2)保证数据记录的唯一性;

    (3)实现表与表之间的参照完整性;

    (4)在使用ORDER by、group by子句进行数据检索时,利用索引可以减少排序和分组的时间。

  • 索引的优缺点?

    优点:

    1.大大加快数据的检索速度;

    2.创建唯一性索引,保证数据库表中每一行数据的唯一性;

    3.加速表和表之间的连接;

    4.在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。


    缺点:

    1.索引需要占物理空间。

    2.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。

  • 如何设计索引?
    1. 使用数据库索引实践推荐的索引类型。
    2. 索引设计建议使用推荐类型,如果需要使用禁用、不推荐、限制使用的索引类型,建议联系GaussDB数据库专家进行评估。

    表1 数据库索引实践推荐

    1. 对于HASH分布表,主键和唯一索引必须包含分布键。
    2. 合理设计组合索引,避免冗余。
    3. 例如已对(a,b,c)创建索引,则不应再单独对 (a)、(b)、(c)、(a,b)、(b,c)创建索引。
    4. 当查询时如果只带有a字段上的过滤条件,一般也会利用组合索引进行查询。
    5. 不建议单表创建多个唯一索引。
    6. 同时维护多个唯一索引的开销远大于维护一个多列唯一索引,如果业务逻辑上多个唯一索引,与一个多列唯一索引等价,应使用多列唯一索引。
    7. 组合索引字段个数不超过5个。
    8. 禁止组合索引组合字符串的总长度超过200。
    9. 索引(包括单列索引和复合索引)字段应为NOT NULL字段。
    10. 同字段上创建索引的维护效率不同。数值类型字段优于字符类型及其他数据类型,因此对于考虑创建索引的ID、时间等字段,建议使用数值类型进行存储。
    11. 建议在关联列上创建索引。
    12. GaussDB支持HASH JOIN,但是当内表较小等RESCAN代价较低的情况下,仍然可能选择NESTLOOP JOIN来完成关联。如果通过EXPLAIN可以查看到NESTLOOP JOIN计划,则可以通过在关联列上创建索引,提高NESTLOOP JOIN效率。


  • 如何创建GaussDB索引?

    为了加速文本搜索,可以创建GIN索引。

    to_tsvector()函数有两个版本。只输一个参数的版本和输两个参数的版本。只输一个参数时,系统默认采用default_text_search_config所指定的分词器。

    请注意:创建索引时必须使用to_tsvector的两参数版本。只有指定了分词器名称的全文检索函数才可以在索引表达式中使用。这是因为索引的内容必须不受default_text_search_config的影响,否则索引内容可能不一致。由于default_text_search_config的值可以随时调整,从而导致不同条目生成的tsvector采用了不同的分词器,并且没有办法区分究竟使用了哪个分词器。正确地转储和恢复这样的索引也是不可能的。

    因为在上述创建索引中to_tsvector使用了两个参数,只有当查询时也使用了两个参数,且参数值与索引中相同时,才会使用该索引。也就是说,WHERE to_tsvector('english', body) @@ 'a & b' 可以使用索引,但WHERE to_tsvector(body) @@ 'a & b'不能使用索引。这确保只使用这样的索引——索引各条目是使用相同的分词器创建的。

    索引中的分词器名称由另一列指定时可以建立更复杂的表达式索引。例如:

    其中body是pgweb表中的一列。当对索引的各条目使用了哪个分词器进行记录时,允许在同一索引中存在混合分词器。在某些场景下这将是有用的。

    例如,文档集合中包含不同语言的文档时。再次强调,打算使用索引的查询必须措辞匹配,例如,WHERE to_tsvector(config_name, body) @@ 'a & b'与索引中的to_tsvector措辞匹配。

    索引甚至可以连接列:

    另一个方法是创建一个单独的tsvector列控制to_tsvector的输出。下面的例子是title和body的连接, 当其它是NULL的时候,使用coalesce确保一个字段仍然会被索引:

    然后为加速搜索创建一个GIN索引:

    现在,就可以执行一个快速全文搜索了:

    相比于一个表达式索引,单独列方法的一个优势是:它没有必要在查询时明确指定分词器以便能使用索引。

    正如上面例子所示,查询可以依赖于default_text_search_config。另一个优势是搜索比较快速,因为它没有必要重新 利用to_tsvector调用来验证索引匹配。表达式索引方法更容易建立,且它需要较少的磁盘空间,因为tsvector形式没有明确存储。

连接云数据库GaussDB的方式

实例连接方式介绍和通过数据管理服务 DAS、内网、公网连接实例


  • 实例连接方式介绍

    GaussDB提供使用内网、公网和数据管理服务(Data Admin Service,简称DAS)的连接方式。

  • DAS连接

    通过华为云数据管理服务(Data Admin Service,简称DAS)这款可视化的专业数据库管理工具,可获得执行SQL、高级数据库管理、智能化运维等功能,做到易用、安全、智能地管理数据库。GaussDB默认开通DAS连接权限。

  • 内网连接

    当应用部署在弹性云服务器上,且该弹性云服务器与GaussDB实例处于同一区域,同一VPC时,建议单独使用内网IP连接弹性云服务器与GaussDB实例。

  • 公网连接

    不能通过内网IP地址访问GaussDB实例时,使用公网访问,建议单独绑定弹性公网IP连接弹性云服务器(或公网主机)与GaussDB实例。

如何使用驱动连接云数据库GaussDB 如何使用驱动连接云数据库GaussDB

支持使用JDBC、ODBC等驱动连接GaussDB数据库

支持使用JDBC、ODBC等驱动连接GaussDB数据库

使用libpq连接云数据库GaussDB

云数据库GaussDB主备版部署形态未对此接口在应用程序开发场景下的使用做验证。

libpq
使用ODBC连接云数据库GaussDB

云数据库GaussDB提供对ODBC3.5的支持。应用程序通过GaussDB驱动连接数据库。

ODBC
使用JDBC连接GaussDB数据库

JDBC是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问接口,云数据库GaussDB提供了对JDBC 4.0特性的支持。

JDBC
使用Psycopg连接云数据库GaussDB

Psycopg是一种用于执行SQL语句的PythonAPI,可以为PostgreSQL、云数据库GaussDB提供统一访问接口。

Psycopg