1. 程式人生 > >CockroachDB SQL開發基礎——建立索引

CockroachDB SQL開發基礎——建立索引

      索引是關係型資料庫中的一種非常重要的物件,通過使用索引查詢資料、避免全表掃描而提升資料庫查詢的效能。CockroachDB(簡稱CRDB)支援較為豐富的索引功能,包括“標準索引(Standard index)”和“倒排索引(Inverted index)”。標準索引與傳統關係型資料庫的索引相同,在CRDB中包括:“主鍵索引”、“唯一(UNIQUE)索引”、單欄位索引和多欄位組合索引等。對於熟悉傳統關係型資料庫的開發人員和DBA來說能夠很好地複用已有知識來使用索引優化SQL查詢。本文將向大家介紹CRDB中索引使用的基本知識。

1. 主鍵索引

在CRDB中,表的主鍵與傳統RDBMS一樣,也是建立表時在定義的主鍵上自動建立一個主鍵索引。主鍵索引可以是單欄位,也可以是多欄位索引。

例如:

CREATE TABLE customers (
  id INT PRIMARY KEY,
  name VARCHAR(30)
);

在建立表之後,我們可以查看錶上建立的索引:

SHOW INDEX FROM customers;

2. 唯一索引(Unique index)

    CRDB的唯一索引與傳統RDBMS一樣。在建立表時對於定義的UNIQUE列會自動建立唯一索引。或者使用CREATE UNIQUE INDEX語句,例如:

CREATE UNIQUE INDEX idx_name ON customers (name);

3. 非唯一索引

    單欄位非唯一索引,例如:

        CREATE INDEX  idx_birthday ON customer (birthday);

    多欄位組合非唯一索引:

        CREATE INDEX  idx_name_birthday ON customer (name, birthday);

4. 建立倒排索引

     在CRDB中倒排索引用於為型別是JSON的欄位建立索引,以提高在JSON型別欄位上檢索的效能。我們看一個示例:

CREATE TABLE users (
  user_id INT PRIMARY KEY,
  last_updated TIMESTAMP DEFAULT now(),
  profile JSONB
);

CREATE INVERTED INDEX ON users (profile);

INSERT INTO users (user_id, profile) VALUES 
 (1, '{"first_name": "Lola", "last_name": "Dog", "location": "NYC", "online" : true, "friends" : 547}'),
 (2, '{"first_name": "Ernie", "status": "Looking for treats", "location" : "Brooklyn"}');

SELECT * FROM users;

5. 建立帶有儲存列的索引

    CRDB中可以建立索引時讓索引除了儲存索引列之外,還儲存表的列。在處理某些SQL查詢時,只需要檢索索引(使用索引列定位記錄的rowid),不用為了取得SELECT語句的投影欄位而訪問表本身了,這樣可以更進一步提升查詢速度。

    假設我們為了優化如下查詢:

        SELECT col1, col2, col3 FROM test1 WHERE col1 = 10 AND col2 > 1;

    我們可以建立如下的索引:

        CREATE INDEX ON test1 (col1, col2) STORING (col3);

    在建立基於col1和col2列(這兩個列用於WHERE條件的處理)的索引同時,把投影中的col1列儲存到索引中。

 

參考:   

    https://www.cockroachlabs.com/docs/stable/create-index.html

    https://www.cockroachlabs.com/docs/stable/inverted-indexes.html