MySQL JSON數據類型實用指南

簡介:在本教程中,您將學習如何使用MySQL JSON數據類型, 以及數據庫中存儲JSON文檔。數據庫

MySQL 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, 
    ... 
);

MySQL JSON數據類型示例

假設咱們必須在網站上跟蹤訪問者及其行爲。一些訪問者可能只是查看頁面,而其餘訪問者可能會查看頁面併購買產品。爲了存儲此信息,咱們將建立一個名爲的新表 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文檔。

相關文章
相關標籤/搜索