時空索引包括Z-ORDER索引和網格二級索引,合理使用時空索引可以有效提高時空查詢的效率。本文介紹建立兩種時空索引的方法和樣本。
Z-ORDER索引
Z-ORDER索引分為Z-ORDER主鍵索引和Z-ORDER二級索引兩種。
使用區別
下表介紹Z-ORDER主鍵索引和Z-ORDER二級索引在使用過程中的區別。
時空索引分類 | 是否支援多個時空列的構建 | 備忘 |
Z-ORDER主鍵索引 | 支援對多個時空列建立索引,但是建議只包含一個時空列,其他時空列可以構建時空二級索引。 | 只能在建立時空資料表時添加主鍵索引,添加後不支援修改、增加和刪除操作。 |
Z-ORDER二級索引 | 支援對多個時空列建立索引。 | 可以在建立時空資料表時添加二級索引,也可以在建立時空資料表之後添加二級索引。添加後支援增加和刪除時空二級索引,不支援修改時空二級索引。 |
建立Z-ORDER主鍵索引
時空編碼作為主鍵索引的組成部分,此時主鍵索引為時空主鍵索引。建立時空主鍵索引的文法樣本如下:
Z-ORDER
索引函數對g列進行時空編碼。-- 主鍵索引只包含Z-ORDER CREATE TABLE point_table(id INT, g GEOMETRY(POINT), name VARCHAR, PRIMARY KEY(Z-ORDER(g))); -- 主鍵索引包含Z-ORDER和ID的組合 CREATE TABLE point_table(id INT, g GEOMETRY(POINT), name VARCHAR, PRIMARY KEY(Z-ORDER(g),id));
Z-ORDER
索引函數對g列和t列進行時空編碼。-- 主鍵索引只包含Z-ORDER CREATE TABLE point_table(id INT, g GEOMETRY(POINT), name VARCHAR, t LONG, PRIMARY KEY(Z-ORDER(g,t))); -- 主鍵索引包含Z-ORDER和ID的組合 CREATE TABLE point_table(id INT, g GEOMETRY(POINT), name VARCHAR, t LONG, PRIMARY KEY(Z-ORDER(g,t),id));
建立Z-ORDER二級索引
時空編碼作為二級索引的組成部分,此時二級索引為時空二級索引。建立時空二級索引的樣本如下:
建立主表,用於儲存時空資料。
CREATE TABLE point_table(id INT, g GEOMETRY(POINT), name VARCHAR, t LONG, PRIMARY KEY(id));
設定主表的屬性。需要將主表的寫入模式MUTABILITY設定為
MUTABLE_LATEST
,一致性CONSISTENCY設定為strong
。ALTER TABLE point_table SET 'MUTABILITY'='MUTABLE_LATEST', 'CONSISTENCY'='strong';
建立時空二級索引。
使用
Z-ORDER
索引函數對g列進行時空編碼。方式一:不冗餘資料。
CREATE INDEX idx ON point_table (Z-ORDER(g));
方式二:採用
include(g)
進行資料冗餘,避免回表查詢。CREATE INDEX idx ON point_table (Z-ORDER(g)) INCLUDE (g);
使用
Z-ORDER
索引函數對g列和t列進行時空編碼。方式一:不冗餘資料。
CREATE INDEX idx ON point_table (Z-ORDER(g,t));
方式二:採用
include(g)
進行資料冗餘,避免回表查詢。CREATE INDEX idx ON point_table (Z-ORDER(g,t)) INCLUDE (g);
網格二級索引
為WGS84座標系下的面類型(POLYGON或MULTIPOLYGON)或線類型(LINESTRING或MULTILINESTRING)資料建立網格二級索引,通過面覆蓋到的網格來實現對面資料的索引。當查詢條件包含對面的判斷條件時,可使用該索引進行加速。
僅寬表引擎2.6.7.5及以上版本,支援線類型(LINESTRING或MULTILINESTRING)。如果您的寬表引擎無法通過控制台進行升級,請聯絡Lindorm支援人員(DingTalk號:s0s3eg3)。
建立網格二級索引
建立主表,用於儲存面資料或線資料。可以將面資料列或線資料列的類型定義為以下幾種:
面資料列的類型定義為GEOMETRY(POLYGON)。
CREATE TABLE test_table1 (id INT, g GEOMETRY(POLYGON), name VARCHAR, t LONG, PRIMARY KEY(id));
面資料列的類型定義為GEOMETRY(MULTIPOLYGON)。
CREATE TABLE test_table1 (id INT, g GEOMETRY(MULTIPOLYGON), name VARCHAR, t LONG, PRIMARY KEY(id));
線資料列的類型定義為GEOMETRY(LINESTRING)。
CREATE TABLE test_table1 (id INT, g GEOMETRY(LINESTRING), name VARCHAR, t LONG, PRIMARY KEY(id));
線資料列的類型定義為GEOMETRY(MULTILINESTRING)。
CREATE TABLE test_table1 (id INT, g GEOMETRY(MULTILINESTRING), name VARCHAR, t LONG, PRIMARY KEY(id));
將資料列的類型定義為不確定具體類型的GEOMETRY。
CREATE TABLE test_table1 (id INT, g GEOMETRY, name VARCHAR, t LONG, PRIMARY KEY(id));
設定主表的屬性。需要將主表的寫入模式MUTABILITY設定為
MUTABLE_LATEST
,一致性CONSISTENCY設定為strong
。ALTER TABLE test_table1 SET 'MUTABILITY'='MUTABLE_LATEST', 'CONSISTENCY'='strong';
使用S2索引函數對g列計算指定精度下覆蓋的網格。目前只針對靜態面類型表,預設採用非同步建立模式,範例程式碼如下:
CREATE INDEX s2_idx ON test_table1 (s2(g, 10));
結果驗證
您可以通過
SHOW INDEX FROM test_table1;
語句查看索引是否建立成功。構建索引。
BUILD INDEX s2_idx ON test_table1;
說明建議主表資料全部寫入完成後再執行
BUILD INDEX
同步歷史資料。BUILD INDEX
語句開始執行後如果主表有新增資料,不會被同步至索引表中。