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多列索引建立與優化.mdMySql索引優化
- 【TUNE_ORACLE】Oracle索引設計思想(二)索引過濾列概述Oracle索引
- 聯合索引和多個單列索引使用中的索引命中情況及索引建立原則索引
- MySQL 唯一索引和普通索引MySql索引
- openGauss 列存表PSort索引索引
- DM7 陣列索引陣列索引
- 什麼是行儲存和列儲存?正排索引和倒排索引?MySQL既不是倒排索引,也索引MySql
- 【TUNE_ORACLE】Oracle索引設計思想(一)索引片和匹配列概述Oracle索引
- Oracle與GreatSQL差異:更改唯一索引列OracleSQL索引
- 尋找陣列的中心索引陣列索引
- DM8管理陣列索引陣列索引
- MySQL <唯一索引>MySql索引
- 【Mysql】一個簡易的索引方案MySql索引
- 關於聯合索引,範圍查詢,時間列索引的幾個問題索引
- Mysql資料庫是如何通過索引定位資料MySql資料庫索引
- mysql索引之字首索引MySql索引
- ElasticSearch 索引 VS MySQL 索引Elasticsearch索引MySql
- MySql(一) 淺析MySql索引MySql索引
- 對存在空值的列建索引索引
- JavaScript 陣列 指定索引位置插入元素JavaScript陣列索引
- 第六篇 numpy陣列索引陣列索引
- 如何在 bash 中使用索引陣列索引陣列
- MySql如何使用索引(一)MySql索引
- Mysql索引優化(一)MySql索引優化
- MySQL如何建立一個好索引?建立索引的5條建議【宇哥帶你玩轉MySQL 索引篇(三)】MySql索引
- mysql 支援索引字元超過 767MySql索引字元
- MySQL索引系列:全文索引MySql索引
- MySQL 字串索引和字首索引MySql字串索引
- mysql索引MySql索引
- [Mysql]索引MySql索引
- MySQL 索引MySql索引
- MySQL — 索引MySql索引
- update表中index索引列對原索引條目做什麼操作?Index索引
- SQL Server 列儲存索引 第一篇:概述SQLServer索引
- LeetCode每日一題:找陣列的中心索引(No.724)LeetCode每日一題陣列索引
- MySQL實戰45講——普通索引和唯一索引MySql索引