時空索引包括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技術支持(釘釘號: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
語句開始執行后如果主表有新增數據,不會被同步至索引表中。