新聞中心
操作?ON數(shù)據(jù)庫取數(shù)指南

隨著數(shù)據(jù)處理技術(shù)的不斷發(fā)展,各種不同的數(shù)據(jù)庫類型也應(yīng)運(yùn)而生。其中一種較為熱門的數(shù)據(jù)庫類型便是ON數(shù)據(jù)庫。這種數(shù)據(jù)庫以文本格式存儲(chǔ)數(shù)據(jù),相較于傳統(tǒng)的關(guān)系型數(shù)據(jù)庫而言,能更好的適應(yīng)各種應(yīng)用場景。本文將為大家講解如何操作ON數(shù)據(jù)庫進(jìn)行數(shù)據(jù)取數(shù),并為大家提供一份ON數(shù)據(jù)庫取數(shù)指南。
ON數(shù)據(jù)庫概述
ON數(shù)據(jù)庫是指能夠?qū)ξ谋靖袷降臄?shù)據(jù)進(jìn)行存取和處理的數(shù)據(jù)庫。ON數(shù)據(jù)庫采用某些方式來存儲(chǔ)ON文本數(shù)據(jù),并能夠在需要時(shí)自動(dòng)執(zhí)行查詢、過濾、排序以及其他數(shù)據(jù)處理功能。常見的ON數(shù)據(jù)庫包括MongoDB、CouchDB等。
ON數(shù)據(jù)庫的優(yōu)點(diǎn)在于它們能夠更好的存儲(chǔ)半結(jié)構(gòu)化數(shù)據(jù)。而在一些應(yīng)用場景下,半結(jié)構(gòu)化數(shù)據(jù)比結(jié)構(gòu)化數(shù)據(jù)更加適用。例如,在許多Web應(yīng)用程序中,數(shù)據(jù)是以O(shè)N格式進(jìn)行傳輸?shù)?。ON數(shù)據(jù)庫使得對這類數(shù)據(jù)進(jìn)行處理更為便捷。
ON數(shù)據(jù)庫的取數(shù)方式
為了從ON數(shù)據(jù)庫中取數(shù),需要使用一些特殊的查詢語句。在ON數(shù)據(jù)庫中,查詢語句是以O(shè)N格式進(jìn)行編寫的。以下是一些常見的ON數(shù)據(jù)庫查詢語句:
1. 對象查詢
對象查詢語句用于從ON文檔中查詢包含特定鍵值對的對象。例如,以下語句可以用于查詢一個(gè)名為customer的對象:
db.collection.find({name:“customer”})
2. 數(shù)組查詢
數(shù)組查詢語句用于從ON文檔中查詢特定值的數(shù)組。例如,以下語句可以用于查詢所有包含值“blue”的數(shù)組:
db.collection.find({colors: “blue”})
3. 操作符
操作符可以用于從ON文檔中查詢符合特定條件的數(shù)據(jù)。例如,以下語句可以用于查詢身高大于170cm的人:
db.collection.find({height: {$gt: 170}})
ON數(shù)據(jù)庫取數(shù)指南
ON數(shù)據(jù)庫的取數(shù)方式可能與傳統(tǒng)的關(guān)系型數(shù)據(jù)庫存在差異。以下是一份ON數(shù)據(jù)庫取數(shù)指南,幫助您更好的使用ON數(shù)據(jù)庫進(jìn)行數(shù)據(jù)取數(shù)。
1. 理解數(shù)據(jù)結(jié)構(gòu)
在將數(shù)據(jù)寫入ON數(shù)據(jù)庫之前,需要事先理解該數(shù)據(jù)的結(jié)構(gòu)。這是因?yàn)镺N數(shù)據(jù)庫是根據(jù)數(shù)據(jù)結(jié)構(gòu)進(jìn)行存儲(chǔ)和查找的。如果您能夠理解數(shù)據(jù)結(jié)構(gòu),那么您將可以更加輕松的編寫查詢語句。
2. 使用正確的查詢語句
無論是關(guān)系型數(shù)據(jù)庫還是ON數(shù)據(jù)庫,查詢語句都是非常重要的。如果您使用不正確的查詢語句,就很可能無法從數(shù)據(jù)庫中獲取所需數(shù)據(jù)。因此,在編寫查詢語句時(shí),需要對查詢語句本身進(jìn)行深刻的理解。如果您對查詢語句存在不確定,可以參考一下其他開發(fā)者編寫的查詢語句。
3. 理解索引
索引是ON數(shù)據(jù)庫中重要的組成部分。索引能夠提高數(shù)據(jù)查詢的效率,在處理大量數(shù)據(jù)時(shí)至關(guān)重要。因此,在存儲(chǔ)大量數(shù)據(jù)時(shí),需要在合適的鍵上添加索引,以獲得更佳的查詢效率。
ON數(shù)據(jù)庫作為一種新型數(shù)據(jù)庫類型,具有很多傳統(tǒng)數(shù)據(jù)庫所不具備的優(yōu)勢。但是,在使用ON數(shù)據(jù)庫取數(shù)時(shí),需要理解ON數(shù)據(jù)庫的特點(diǎn),并使用正確的查詢語句和索引。期望上述ON數(shù)據(jù)庫取數(shù)指南能夠?qū)δ谌粘i_發(fā)工作中的工作帶來一些幫助。
相關(guān)問題拓展閱讀:
- mysql怎么搜索json格式的數(shù)據(jù)
mysql怎么搜索json格式的數(shù)據(jù)
在MySQL與PostgreSQL的對比中,PG的ON格式支持優(yōu)勢總是不斷被拿來比較。其實(shí)早先MariaDB也有對非結(jié)構(gòu)化的數(shù)據(jù)進(jìn)行存儲(chǔ)的方案,稱為dynamic column,但是方案是通過BLOB類型的方式來存儲(chǔ)。這樣導(dǎo)致的問題是查詢性能不高,不能有效建立索引,與一些文檔數(shù)據(jù)庫對比,優(yōu)勢并不大,故在社區(qū)的反應(yīng)其實(shí)比較一般。當(dāng)然,MariaDB的dynamic column功能還不僅限于非結(jié)構(gòu)化數(shù)據(jù)的存儲(chǔ),但不在本文進(jìn)行展開。
MySQL 5.7.7 labs版本開始InnoDB存儲(chǔ)引擎已經(jīng)原生支持ON格式,該格式不是簡單的BLOB類似的替換。原生的ON格式支持有以下的優(yōu)勢:
ON數(shù)據(jù)有效性檢查:BLOB類型無法在數(shù)據(jù)庫層做這樣的約束性檢查
查詢性能的提升:查詢不需要遍歷所有字符串才能找到數(shù)據(jù)
支持索引:通過虛擬列的功能可以對ON中的部分?jǐn)?shù)據(jù)進(jìn)行索引
首先我們來看如何在MySQL中使用原生的ON格式:
mysql> create table user ( uid int auto_increment,
-> data json,primary key(uid))engine=innodb;
Query OK, 0 rows affected (0.01 sec)
mysql> insert into user values (NULL,
-> ‘{“name”:”David”,”mail”:””,”address”:”Shangahai”}’);
Query OK, 1 row affected (0.00 sec)
mysql> insert into user values (NULL,'{“name”:”Amy”,”mail”:””}’);
Query OK, 1 row affected (0.00 sec)
可以看到我們新建了表user,并且將列data定義為了ON類型。這意味著我們可以對插入的數(shù)據(jù)做ON格式檢查,確保其符合ON格式的約束,如插入一條不合法的ON數(shù)據(jù)會(huì)報(bào)如下錯(cuò)誤:
mysql> insert into user values (NULL,”test”);
ERROR 3130 (22023): Invalid ON text: “Invalid value” at position 2 in value (or column) ‘test’.
此外,正如前面所說的,MySQL 5.7提供了一系列函數(shù)來高效地處理ON字符,而不是需要遍歷所有字符來查找,這不得不說是對MariaDB dynamic column的巨大改進(jìn):
mysql> select jsn_extract(data, ‘$.name’),jsn_extract(data,’$.address’) from user;
+-+—+
| jsn_extract(data, ‘$.name’) | jsn_extract(data,’$.address’) |
+-+—+
| “David” | “Shangahai” |
| “Amy” | NULL |
+-+—+
2 rows in set (0.00 sec)
當(dāng)然,最令人的激動(dòng)的功能應(yīng)該是MySQL 5.7的虛擬列功能,通過傳統(tǒng)的B+樹索引即可實(shí)現(xiàn)對ON格式部分屬性的快速查詢。使用方法是首先創(chuàng)建該虛擬列,然后在該虛擬列上創(chuàng)建索引:
mysql> ALTER TABLE user ADD user_name varchar(128)
-> GENERATED ALWAYS AS (jsn_extract(data,’$.name’)) VIRTUAL;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> select user_name from user;
++
| user_name |
++
| “Amy” |
| “David” |
++
2 rows in set (0.00 sec)
mysql> alter table user add index idx_username (user_name);
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
然后可以通過添加的索引對用戶名進(jìn)行快速的查詢,這和普通類型的列查詢一樣。而通過explain可以驗(yàn)證優(yōu)化器已經(jīng)選擇了在虛擬列上創(chuàng)建的新索引:
mysql> explain select * from user where user_name='”Amy”‘\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user
partitions: NULL
type: ref
possible_keys: idx_username
key: idx_username
key_len: 131
ref: const
rows: 1
filtered: 100.00
Extra: NULL
1 row in set, 1 warning (0.00 sec)
可以發(fā)現(xiàn)MySQL 5.7對于ON格式堪稱完美,相信PostgreSQL陣營需要尋找新的策略來“攻擊”MySQL了吧。如無意外,還是會(huì)停留在優(yōu)化器這塊,畢竟這塊是目前MySQL必須要克服的更大問題,好在MySQL團(tuán)隊(duì)已經(jīng)在重構(gòu)優(yōu)化器代碼,相信更好的優(yōu)化器將會(huì)在下一個(gè)版本中全面爆發(fā)。而一大堆文檔數(shù)據(jù)庫們已經(jīng)哭暈在廁所了吧。
我們知道,ON是一種輕量級(jí)的數(shù)據(jù)交互的格式,大部分NO SQL數(shù)據(jù)庫的存儲(chǔ)都用ON。MySQL從5.7開始支持ON格式的數(shù)據(jù)存儲(chǔ),并且新增了很多ON相關(guān)函數(shù)。MySQL 8.0 又帶來了一個(gè)新的把ON轉(zhuǎn)換為TABLE的函數(shù)ON_TABLE,實(shí)現(xiàn)了ON到表的轉(zhuǎn)換。
舉例一
我們看下簡單的例子:
簡單定義一個(gè)兩級(jí)ON 對象
mysql> set @ytt='{“name”:}’;Query OK, 0 rows affected (0.00 sec)
之一級(jí):
mysql> select json_keys(@ytt);+—+| json_keys(@ytt) |+—+| |+—+1 row in set (0.00 sec)
第二級(jí):
mysql> select json_keys(@ytt,’$.name’);+-+| json_keys(@ytt,’$.name’) |+-+| |+-+1 row in set (0.00 sec)
我們使用MySQL 8.0 的ON_TABLE 來轉(zhuǎn)換 @ytt。
mysql> select * from json_table(@ytt,’$.name’ columns (f1 varchar(10) path ‘$.a’, f2 varchar(10) path ‘$.b’)) as tt;
+++
| f1 | f2 |
+++
| ytt | action |
| dble | shard |
| mysql | oracle |
+++
3 rows in set (0.00 sec)
舉例二
再來一個(gè)復(fù)雜點(diǎn)的例子,用的是EXPLAIN 的ON結(jié)果集。
ON 串 @json_str1。
set @json_str1 = ‘ { “query_block”: { “select_id”: 1, “cost_info”: { “query_cost”: “1.00” }, “table”: { “table_name”: “bigtable”, “access_type”: “const”, “possible_keys”: , “key”: “id”, “used_key_parts”: , “key_length”: “8”, “ref”: , “rows_examined_per_scan”: 1, “rows_produced_per_join”: 1, “filtered”: “100.00”, “cost_info”: {“read_cost”: “0.00”,”eval_cost”: “0.20”,”prefix_cost”: “0.00”,”data_read_per_join”: “176” }, “used_columns”: } }}’;
之一級(jí):
mysql> select json_keys(@json_str1) as ‘first_object’;+—+| first_object |+—+| |+—+1 row in set (0.00 sec)
第二級(jí):
mysql> select json_keys(@json_str1,’$.query_block’) as ‘second_object’;++| second_object|++| |++1 row in set (0.00 sec)
第三級(jí):
mysql> select json_keys(@json_str1,’$.query_block.table’) as ‘third_object’\G*************************** 1. row ***************************third_object: 1 row in set (0.01 sec)
第四級(jí):
mysql> select json_extract(@json_str1,’$.query_block.table.cost_info’) as ‘forth_object’\G*************************** 1. row ***************************forth_object: {“eval_cost”:”0.20″,”read_cost”:”0.00″,”prefix_cost”:”0.00″,”data_read_per_join”:”176″}1 row in set (0.00 sec)
那我們把這個(gè)ON 串轉(zhuǎn)換為表。
SELECT * FROM ON_TABLE(@json_str1,
“$.query_block”
COLUMNS(
rowid FOR ORDINALITY,
NESTED PATH ‘$.table’
COLUMNS (
a1_1 varchar(100) PATH ‘$.key’,
a1_2 varchar(100) PATH ‘$.ref’,
a1_3 varchar(100) PATH ‘$.filtered’,
nested path ‘$.cost_info’
columns (
a2_1 varchar(100) PATH ‘$.eval_cost’ ,
a2_2 varchar(100) PATH ‘$.read_cost’,
a2_3 varchar(100) PATH ‘$.prefix_cost’,
a2_4 varchar(100) PATH ‘$.data_read_per_join’
),
a3 varchar(100) PATH ‘$.key_length’,
a4 varchar(100) PATH ‘$.table_name’,
a5 varchar(100) PATH ‘$.access_type’,
a6 varchar(100) PATH ‘$.used_key_parts’,
a7 varchar(100) PATH ‘$.rows_examined_per_scan’,
a8 varchar(100) PATH ‘$.rows_produced_per_join’,
a9 varchar(100) PATH ‘$.key’
),
NESTED PATH ‘$.cost_info’
columns (
b1_1 varchar(100) path ‘$.query_cost’
),
c INT path “$.select_id”
)
) AS tt;
++——+++——+——+——+——+——+++——+——+——+——+——+——+
| rowid | a1_1 | a1_2 | a1_3 | a2_1 | a2_2 | a2_3 | a2_4 | a3 | a| a5 | a6 | a7 | a8 | a9 | b1_1 | c |
++——+++——+——+——+——+——+++——+——+——+——+——+——+
|| id | const | 100.00 | 0.20 | 0.00 | 0.00 | 176 | 8 | bigtable | const | id | 1 | 1 | id | NULL | 1 |
|| NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 1.00 | 1 |
++——+++——+——+——+——+——+++——+——+——+——+——+——+
2 rows in set (0.00 sec)
當(dāng)然,ON_table 函數(shù)還有其他的用法,我這里不一一列舉了,詳細(xì)的參考手冊。
請點(diǎn)擊輸入圖片描述
請點(diǎn)擊輸入圖片描述
關(guān)于怎么取json里的數(shù)據(jù)庫的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
網(wǎng)頁題目:操作?json數(shù)據(jù)庫取數(shù)指南(怎么取json里的數(shù)據(jù)庫)
本文鏈接:http://fisionsoft.com.cn/article/cocdijp.html


咨詢
建站咨詢
