簡介:在本教程中,您將學習如何使用MySQL JSON數據類型, 以及數據庫中存儲JSON文檔。數據庫
從版本5.7.8開始,MySQL支持本機JSON數據類型。本地JSON數據類型使您比之前版本中的JSON文本格式更有效地存儲JSON文檔。json
MySQL 之內部格式存儲 JSON 文檔,該格式容許快速讀取文檔元素。JSON 二進制格式的結構容許服務器直接經過鍵或數組索引在 JSON 文檔中搜索值。數組
JSON文檔的存儲與 LONGBLOB 或 LONGTEXT 數據的存儲大體相同。瀏覽器
要定義數據類型爲JSON的列,請使用如下語法:服務器
CREATE TABLE table_name ( ... json_column_name JSON, ... );
注意: JSON 列 不能具備默認值。此外, JSON 列沒法直接創建索引。您能夠在生成的 虛擬列(Generated Column)上建立索引,該索引包含從 JSON 列提取的值。當您從 JSON 列查詢數據時,MySQL 優化器將在與 JSON 表達式匹配的虛擬列上查找兼容索引。
在MySQL 5.7中,支持兩種Generated Column,即Virtual Generated Column和Stored Generated Column,前者只將Generated Column保存在數據字典中(表的元數據),並不會將這一列數據持久化到磁盤上;後者會將Generated Column持久化到磁盤上,而不是每次讀取的時候計算所得。很明顯,後者存放了能夠經過已有數據計算而得的數據,須要更多的磁盤空間,與Virtual Column相比並無優點,所以,MySQL 5.7中,不指定Generated Column的類型,默認是Virtual Column。學習
生成列索引建立方式以下:優化
CREATE TABLE table_name ( ... `names_virtual` VARCHAR(20) GENERATED ALWAYS AS (`json_column_name` ->> '$.name') NOT NULL, ... );
假設咱們必須在網站上跟蹤訪問者及其行爲。一些訪問者可能只是查看頁面,而其餘訪問者可能會查看頁面併購買產品。爲了存儲此信息,咱們將建立一個名爲的新表 events。網站
CREATE TABLE events( id int auto_increment primary key, event_name varchar(255), visitor varchar(255), properties json, browser json );
事件表中的每一個事件都有一個惟一標識事件的 id 標識。事件還具備例如瀏覽量,購買等字段。visitor 列用於存儲訪客信息。code
properties 與 browser 列是JSON列。它們用於存儲事件的屬性和訪問者用來瀏覽網站的瀏覽器屬性。教程
讓咱們將一些數據插入events表中:
INSERT INTO events(event_name, visitor,properties, browser) VALUES ( 'pageview', '1', '{ "page": "/" }', '{ "name": "Safari", "os": "Mac", "resolution": { "x": 1920, "y": 1080 } }' ), ('pageview', '2', '{ "page": "/contact" }', '{ "name": "Firefox", "os": "Windows", "resolution": { "x": 2560, "y": 1600 } }' ), ( 'pageview', '1', '{ "page": "/products" }', '{ "name": "Safari", "os": "Mac", "resolution": { "x": 1920, "y": 1080 } }' ), ( 'purchase', '3', '{ "amount": 200 }', '{ "name": "Firefox", "os": "Windows", "resolution": { "x": 1600, "y": 900 } }' ), ( 'purchase', '4', '{ "amount": 150 }', '{ "name": "Firefox", "os": "Windows", "resolution": { "x": 1280, "y": 800 } }' ), ( 'purchase', '4', '{ "amount": 500 }', '{ "name": "Chrome", "os": "Windows", "resolution": { "x": 1680, "y": 1050 } }' );
要從 JSON 列中提取值,請使用列路徑運算符(->)。
SELECT id, browser->'$.name' browser FROM events;
該查詢返回如下輸出:
+----+---------+ | id | browser | +----+---------+ | 1 | "Safari" | | 2 | "Firefox" | | 3 | "Safari" | | 4 | "Firefox" | | 5 | "Firefox" | | 6 | "Chrome" | +----+---------+ 6 rows in set (0.00 sec)
請注意,該browser列中的數據用引號引發來。要去除引號,請使用內聯路徑運算符(->>),以下所示:
SELECT id, browser->>'$.name' browser FROM events;
以下面的輸出所示,引號已刪除:
+----+---------+ | id | browser | +----+---------+ | 1 | Safari | | 2 | Firefox | | 3 | Safari | | 4 | Firefox | | 5 | Firefox | | 6 | Chrome | +----+---------+ 6 rows in set (0.00 sec)
要得到瀏覽器的使用率,能夠使用如下語句:
SELECT browser->>'$.name' browser, count(browser) FROM events GROUP BY browser->>'$.name';
查詢的輸出以下:
+---------+----------------+ | browser | count(browser) | +---------+----------------+ | Safari | 2 | | Firefox | 3 | | Chrome | 1 | +---------+----------------+ 3 rozws in set (0.02 sec)
要計算訪問者的總收入,請使用如下查詢:
SELECT visitor, SUM(properties->>'$.amount') revenue FROM events WHERE properties->>'$.amount' > 0 GROUP BY visitor;
這是輸出:
+---------+---------+ | visitor | revenue | +---------+---------+ | 3 | 200 | | 4 | 650 | +---------+---------+ 2 rows in set (0.00 sec)
在本教程中,您瞭解了MySQL JSON數據類型以及如何使用它在數據庫中存儲JSON文檔。