MySQL通過通用列索引來提供一個JSON列索引
通過通用列索引來提供一個JSON列索引,不能直接對JSON列進行索引。要建立間接引用此類列的索引,可以定義一個生成的列,提取應該索引的資訊,然後在生成的列上建立索引,如本例所示
mysql> CREATE TABLE jemp ( -> c JSON, -> g INT GENERATED ALWAYS AS (c->"$.id"), -> INDEX i (g) -> ); Query OK, 0 rows affected (0.12 sec) mysql> INSERT INTO jemp (c) VALUES -> ('{"id": "1", "name": "Fred"}'), ('{"id": "2", "name": "Wilma"}'), -> ('{"id": "3", "name": "Barney"}'), ('{"id": "4", "name": "Betty"}'); Query OK, 4 rows affected (0.04 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> SELECT c->>"$.name" AS name FROM jemp WHERE g > 2; +--------+ | name | +--------+ | Barney | | Betty | +--------+ 2 rows in set (0.00 sec) mysql> EXPLAIN SELECT c->>"$.name" AS name FROM jemp WHERE g > 2\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: jemp partitions: NULL type: range possible_keys: i key: i key_len: 5 ref: NULL rows: 2 filtered: 100.00 Extra: Using where 1 row in set, 1 warning (0.00 sec) mysql> SHOW WARNINGS\G *************************** 1. row *************************** Level: Note Code: 1003 Message: /* select#1 */ select json_unquote(json_extract(`mysql`.`jemp`.`c`,'$.name')) AS `name` from `mysql`.`jemp` where (`mysql`.`jemp`.`g` > 2) 1 row in set (0.00 sec)
我們已經包裝了本例中最後一條語句的輸出,以適應檢視區域。
在MySQL 5.7.9及以後的版本中支援->操作符。從MySQL 5.7.13開始支援->>操作符
當對一個select或其它包含一個或多個使用->或->>操作符表示式的SQL語句時使用explain時,這些表示式將被翻譯成等價的json_extract()和(如果需要)json_unquote()代替,例如下面的explain語句使用show warnings立即輸出結果:
mysql> EXPLAIN SELECT c->>"$.name" FROM jemp WHERE g > 2 ORDER BY c->"$.name"\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: jemp partitions: NULL type: range possible_keys: i key: i key_len: 5 ref: NULL rows: 2 filtered: 100.00 Extra: Using where; Using filesort 1 row in set, 1 warning (0.00 sec) mysql> show warnings\G *************************** 1. row *************************** Level: Note Code: 1003 Message: /* select#1 */ select json_unquote(json_extract(`mysql`.`jemp`.`c`,'$.name')) AS `c->>"$.name"` from `mysql`.`jemp` where (`mysql`.`jemp`.`g` > 2) order by json_extract(`mysql`.`jemp`.`c`,'$.name') 1 row in set (0.00 sec)
可以看到->和->>操作符使用json_extract()和json_unquote()函式來描述。這種技術可以被用來為那些不能被直接索引的間接引用列提供索引 ,比如geometry列。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26015009/viewspace-2848205/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL 生成列索引MySql索引
- 索引與null(一):單列索引索引Null
- 通過例項來理解MySQL索引薦MySql索引
- MySQL5.7 JSON型別列建立索引查詢一例MySqlJSON型別索引
- 唯一索引,可以在索引列插入多個null嗎索引Null
- MySQL單列索引和組合索引的區別MySql索引
- 跳過索引某些列任然使用索引的特性索引
- 認識SQLServer索引以及單列索引和多列索引的不同SQLServer索引
- MySQL單列索引和組合索引的區別介紹MySql索引
- Mysql多列索引建立與優化.mdMySql索引優化
- 【TUNE_ORACLE】Oracle索引設計思想(二)索引過濾列概述Oracle索引
- 聯合索引和多個單列索引使用中的索引命中情況及索引建立原則索引
- 兩列複合索引中(交換索引中列的順序),選索引的原則是?因為索引名字ascii碼小?索引ASCII
- DM7 陣列索引陣列索引
- SQLServeronLinux列儲存索引SQLServerLinux索引
- oracle查詢表資訊(索引,外來鍵,列等)Oracle索引
- MySQL5.7 虛擬列實現表示式索引MySql索引
- Linux 通過命令列解析JSON字串Linux命令列JSON字串
- 包含列的索引:SQL Server索引進階 Level 5索引SQLServer
- MySQL 唯一索引和普通索引MySql索引
- 【TUNE_ORACLE】Oracle索引設計思想(一)索引片和匹配列概述Oracle索引
- 什麼是行儲存和列儲存?正排索引和倒排索引?MySQL既不是倒排索引,也索引MySql
- Oracle與GreatSQL差異:更改唯一索引列OracleSQL索引
- SQL Server 索引和表體系結構(包含列索引)SQLServer索引
- js 在陣列的指定索引位置插入一個新的元素JS陣列索引
- mysql索引合併:一條sql可以使用多個索引MySql索引
- DM8管理陣列索引陣列索引
- 尋找陣列的中心索引陣列索引
- PostgreSQLGIN單列聚集索引應用SQL索引
- php關聯陣列和索引陣列差別PHP陣列索引
- 索引多個資料列提高效能(轉)索引
- 【Mysql】一個簡易的索引方案MySql索引
- MySQL <唯一索引>MySql索引
- 關於聯合索引,範圍查詢,時間列索引的幾個問題索引
- Mysql資料庫是如何通過索引定位資料MySql資料庫索引
- 資料列not null對索引影響一例Null索引
- java之陣列的索引,排序以及二維陣列Java陣列索引排序
- MySql(一) 淺析MySql索引MySql索引