CockroachDB索引

CRDB使用CREATE INDEX创建索引,索引用来帮助SQL查询数据而不用进行全表扫描,从而提高性能。表的字段如果被定义为PRIMARY KEY或UNIQUE,会自动创建索引。如果想在JSONB或ARRAY上面创建索引,可以创建GIN索引。
CRDB的索引包括以下几类:

  • 单列索引
  • 多列索引
  • 唯一索引
  • 倒排索引(GIN索引)
  • 空间索引(GIST索引)
  • 覆盖索引
  • HASH分片索引
  • 部分索引
  • 表达式索引

单列索引

即索引中只包含一个字段,如

root@10.10.12.87:20158/defaultdb> create index idx_user on users(id);
CREATE INDEX
root@10.10.12.87:20158/defaultdb> show create table users;table_name |                      create_statement
-------------+--------------------------------------------------------------users      | CREATE TABLE public.users (|     id INT8 NULL,|     name VARCHAR(10) NULL,|     rowid INT8 NOT VISIBLE NOT NULL DEFAULT unique_rowid(),|     CONSTRAINT "primary" PRIMARY KEY (rowid ASC),|     INDEX idx_user (id ASC),|     FAMILY "primary" (id, name, rowid)| )
(1 row)

多列索引

即索引中有多个字段,如

root@10.10.12.87:20158/defaultdb> create index idx2_user on users(id,name);
CREATE INDEX
root@10.10.12.87:20158/defaultdb> show create table users;table_name |                      create_statement
-------------+--------------------------------------------------------------users      | CREATE TABLE public.users (|     id INT8 NULL,|     name VARCHAR(10) NULL,|     rowid INT8 NOT VISIBLE NOT NULL DEFAULT unique_rowid(),|     CONSTRAINT "primary" PRIMARY KEY (rowid ASC),|     INDEX idx_user (id ASC),|     INDEX idx2_user (id ASC, name ASC),|     FAMILY "primary" (id, name, rowid)| )
(1 row)

唯一索引

即创建的索引具有唯一性,如

root@10.10.12.87:20158/defaultdb> create unique index idx3_user on users(name);
CREATE INDEXroot@10.10.12.87:20158/defaultdb> show create table users;table_name |                      create_statement
-------------+--------------------------------------------------------------users      | CREATE TABLE public.users (|     id INT8 NULL,|     name VARCHAR(10) NULL,|     rowid INT8 NOT VISIBLE NOT NULL DEFAULT unique_rowid(),|     CONSTRAINT "primary" PRIMARY KEY (rowid ASC),|     INDEX idx_user (id ASC),|     INDEX idx2_user (id ASC, name ASC),|     UNIQUE INDEX idx3_user (name ASC),|     FAMILY "primary" (id, name, rowid)| )
(1 row)

倒排索引(GIN索引)

倒排索引(GIN索引)存储从容器列(如JSONB文档)中的值到保存该值的行的映射。它们用于加速包含搜索,例如,“显示该表中所有具有包含键-值对{“location”:“NYC”}的JSON列的行”。GIN索引是文献检索系统中常用的索引。
cockachdb在GIN索引中存储以下数据类型的内容:

  • JSONB
  • ARRAY
  • 空间数据
root@10.10.12.87:20158/defaultdb> create table promo_codes(id int, rules jsonb);
CREATE TABLE
root@10.10.12.87:20158/defaultdb> create inverted index gin_promo_codes on promo_codes(rules);
CREATE INDEX
root@10.10.12.87:20158/defaultdb> create index gin2_promo_codes on promo_codes using gin(rules);
CREATE INDEXroot@10.10.12.87:20158/defaultdb> show create table promo_codes;table_name  |                      create_statement
--------------+--------------------------------------------------------------promo_codes | CREATE TABLE public.promo_codes (|     id INT8 NULL,|     rules JSONB NULL,|     rowid INT8 NOT VISIBLE NOT NULL DEFAULT unique_rowid(),|     CONSTRAINT "primary" PRIMARY KEY (rowid ASC),|     INVERTED INDEX gin_promo_codes (rules),|     INVERTED INDEX gin2_promo_codes (rules),|     FAMILY "primary" (id, rules, rowid)| )
(1 row)

空间索引(GIST索引)

空间索引存储空间对象的信息,但它们与任何其他索引类型用于相同的任务,即,

  • 基于空间谓词函数(如ST_Contains)的形状列表的快速过滤。
  • 加速涉及空间数据列的连接。

空间索引与其他类型的索引有如下区别:

  • 它们专门用于处理二维几何和地理数据类型。它们被CRDB作为特殊类型的GIN索引存储。
  • 如果需要,可以根据应用程序的需要对它们进行调优,以存储被索引的形状的更松散或更紧凑的覆盖。紧密覆盖的生成、存储和更新成本更高,但在某些情况下性能更好,因为它们在初始索引查找期间返回更少的误报。更紧密的覆盖也会导致较差的性能,因为索引中有更多的行,并且在存储层有更多的扫描。
root@10.10.12.87:20158/defaultdb> CREATE INDEX geom_idx_1 ON tmp_viz USING GIST(geom);
CREATE INDEX
root@10.10.12.87:20158/defaultdb> show create table tmp_viz;table_name |                      create_statement
-------------+--------------------------------------------------------------tmp_viz    | CREATE TABLE public.tmp_viz (|     id INT8 NULL,|     geom GEOMETRY NULL,|     rowid INT8 NOT VISIBLE NOT NULL DEFAULT unique_rowid(),|     CONSTRAINT "primary" PRIMARY KEY (rowid ASC),|     INVERTED INDEX geom_idx_1 (geom),|     FAMILY "primary" (id, geom, rowid)| )
(1 row)

覆盖索引

覆盖索引是为了避免按索引查询回表,而把查询中除索引以外的字段也存储在索引里面,如对于查询select city from user1 where name=‘ABC’;

root@10.10.12.87:20158/defaultdb> create table user1(id int, name varchar(10), city varchar(10));
CREATE TABLE
root@10.10.12.87:20158/defaultdb> create index idx_user1 on user1(name) storing (city);
CREATE INDEX
root@10.10.12.87:20158/defaultdb> show create table user1;table_name |                      create_statement
-------------+--------------------------------------------------------------user1      | CREATE TABLE public.user1 (|     id INT8 NULL,|     name VARCHAR(10) NULL,|     city VARCHAR(10) NULL,|     rowid INT8 NOT VISIBLE NOT NULL DEFAULT unique_rowid(),|     CONSTRAINT "primary" PRIMARY KEY (rowid ASC),|     INDEX idx_user1 (name ASC) STORING (city),|     FAMILY "primary" (id, name, city, rowid)| )
(1 row)

HASH分片索引

如果索引是按照某个递增的字段创建,那么随着数据的增加,索引的数据写入也会造成一个热点写的问题,此时我们希望把索引建成HASH分片索引,以此来解决写入的热点问题。

root@10.10.12.87:20158/defaultdb> create table events(id int, ts timestamp);
CREATE TABLE
root@10.10.12.87:20158/defaultdb> create index idx_events on events(ts) using hash WITH BUCKET_COUNT=4;
CREATE INDEX
root@10.10.12.87:20158/defaultdb> show create table events;table_name |                                                      create_statement
-------------+------------------------------------------------------------------------------------------------------------------------------events     | CREATE TABLE public.events (|     id INT8 NULL,|     ts TIMESTAMP NULL,|     rowid INT8 NOT VISIBLE NOT NULL DEFAULT unique_rowid(),|     dbms_internal_ts_shard_4 INT4 NOT VISIBLE NOT NULL AS (mod(fnv32(dbms_internal.datums_to_bytes(ts)), 4:::INT8)) STORED,|     CONSTRAINT "primary" PRIMARY KEY (rowid ASC),|     INDEX idx_events (ts ASC) USING HASH WITH BUCKET_COUNT = 4,|     FAMILY "primary" (id, ts, rowid, dbms_internal_ts_shard_4),|     CONSTRAINT check_dbms_internal_ts_shard_4 CHECK (dbms_internal_ts_shard_4 IN (0:::INT8, 1:::INT8, 2:::INT8, 3:::INT8))| )
(1 row)

部分索引

部分索引允许指定要添加到索引中的行和列的子集。部分索引包括表中对创建索引时定义的布尔谓词表达式(即WHERE过滤器)求值为true的行子集。

root@10.10.12.87:20158/defaultdb> create index idx2_user1 on user1(name) where city='SH';
CREATE INDEX
root@10.10.12.87:20158/defaultdb> show create table user1;table_name |                      create_statement
-------------+--------------------------------------------------------------user1      | CREATE TABLE public.user1 (|     id INT8 NULL,|     name VARCHAR(10) NULL,|     city VARCHAR(10) NULL,|     rowid INT8 NOT VISIBLE NOT NULL DEFAULT unique_rowid(),|     CONSTRAINT "primary" PRIMARY KEY (rowid ASC),|     INDEX idx_user1 (name ASC) STORING (city),|     INDEX idx2_user1 (name ASC) WHERE city = 'SH':::STRING,|     FAMILY "primary" (id, name, city, rowid)| )
(1 row)

表达式索引

表达式索引又称为函数索引,是针对字段的特定函数增加的索引,如substr、instr后的索引。

root@10.10.12.87:20158/defaultdb> create index idx3_users on user1(substr(city,1,5));
CREATE INDEX
root@10.10.12.87:20158/defaultdb> show create table user1;table_name |                       create_statement
-------------+---------------------------------------------------------------user1      | CREATE TABLE public.user1 (|     id INT8 NULL,|     name VARCHAR(10) NULL,|     city VARCHAR(10) NULL,|     rowid INT8 NOT VISIBLE NOT NULL DEFAULT unique_rowid(),|     CONSTRAINT "primary" PRIMARY KEY (rowid ASC),|     INDEX idx_user1 (name ASC) STORING (city),|     INDEX idx2_user1 (name ASC) WHERE city = 'SH':::STRING,|     INDEX idx3_users (substr(city, 1:::INT8, 5:::INT8) ASC),|     FAMILY "primary" (id, name, city, rowid)| )
(1 row)


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部