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