天天看點

MariaDB 和 mysql 對于JSON資料存儲處理對比

因為業務需求,故用到了資料庫的JSON存儲功能,JSON正迅速成為資料交換和非結構化資料的标準格式,可以将關系資料與非結構化資料混合。

json 可以 随意增減存儲長度,對于不确定列個數和不确定列的字元串存儲長度的情況,可以很好的完成存儲功能;

然後因為我使用的是MariaDB 10.1版本,支援下面兩種示例:

DROP TABLE IF EXISTS `test1`;
CREATE TABLE `test1`  (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `info`  blob,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Compact;


INSERT INTO test1(info)
VALUES(COLUMN_CREATE('XB_NAME', '男', 'MZ', '漢族'));

INSERT INTO test1(info)
VALUES(COLUMN_CREATE('XB_NAME', '女', 'MZ', '回族'));

SELECT id,COLUMN_GET(info, 'XB_NAME' AS CHAR) AS XB_NAME FROM test1 where 
COLUMN_GET(info, 'XB_NAME' AS CHAR)='男'
           

上面這種個人覺得不是很友善,有條件檢索,可以滿足我的需求,但是傳值的方式有點不好,是以,繼續探索;

DROP TABLE IF EXISTS `test1`;
CREATE TABLE `test1`  (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `info`  blob,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Compact;


INSERT INTO test1(info)
VALUES(COLUMN_CREATE('XB_NAME', '男', 'MZ', '漢族'));

INSERT INTO test1(info)
VALUES(COLUMN_CREATE('XB_NAME', '女', 'MZ', '回族'));

SELECT id,COLUMN_GET(info, 'XB_NAME' AS CHAR) AS XB_NAME FROM test1 where 
COLUMN_GET(info, 'XB_NAME' AS CHAR)='男'
           

然而并沒有找到條件查詢的方法;

然後網上有人說,MariaDB 10.2 不支援條件查詢,為了自己檢驗一下,然後,我把資料庫更新了,從10.1 更新到了10.4.6版本

MariaDB 和 mysql 對于JSON資料存儲處理對比

本地windows 更新方法

    本地windows MariaDB 升版本 可以參考一下

下面這個連接配接是官網對于json的介紹和文檔:

https://mariadb.com/resources/blog/json-with-mariadb-10-2/

好了,現在資料庫也更新好了,那繼續測試,如果想看更詳細的示例,就去官網看

DROP TABLE IF EXISTS `products`;
CREATE TABLE products(id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(255) NOT NULL,
  price DECIMAL(9,2) NOT NULL,
  stock INTEGER NOT NULL,
  attr VARCHAR(1024),
  CHECK (attr IS NULL OR JSON_VALID(attr)));
           

插入資料: 

INSERT INTO products VALUES(NULL, 'Jeans', 10.5, 165, NULL);
INSERT INTO products VALUES(NULL, 'Shirt', 10.5, 78, '{"size": 42, "colour": "white"}');
INSERT INTO products VALUES(NULL, 'Blouse', 17, 15, '{"colour": "white"}');
           
MariaDB 和 mysql 對于JSON資料存儲處理對比

添加索引給json

##增加一列
ALTER TABLE products ADD attr_colour VARCHAR(32) AS (JSON_VALUE(attr, '$.colour'));
#在增加列上面加索引
CREATE INDEX products_attr_colour_ix ON products(attr_colour);

#再增加一條資料
INSERT INTO products VALUES(NULL, 'Shirt', 10.5, 78, '{"size": 42, "colour": "red"}',null);
           
MariaDB 和 mysql 對于JSON資料存儲處理對比

索引是一個計算列,跟你的attr資料相關,當attr改變,索引列資料也會随之改變

可以在索引上進行條件查詢:

SELECT * FROM products WHERE attr_colour = 'white';
           

這種要做條件查詢的話,需要加索引,但是因為我們目前的業務資料量較大,主要是單個json對象比較大,即單行資料比較多,可能單行有100多列,每個字段字元超過300的情況,每一個列都要加檢索,這種情況下,資料庫單表比較難以支撐,漢字不可超過2萬多單行,位元組不可超過65535單行,是以,再看看mysql的json處理方案;

-------------------------------------------------------------------我不是很擅長描述,mysql---------------------------------------------------------------

好了,在本機有裝了一台mysql 8.0 版本,端口寫的3308,因為3306已經被MariaDB 占用了

官方json文檔位址:https://dev.mysql.com/doc/refman/8.0/en/json.html,大家可以自己去看,

MySQL支援由RFC 7159定義的原生JSON資料類型,它支援對JSON (JavaScript對象表示法)文檔中的資料的有效通路。

#建立一張表
CREATE TABLE t1 (jdoc JSON);
INSERT INTO t1 VALUES('{"key1": "value1", "key2": "value2"}');
INSERT INTO t1 VALUES('[1, 2,3]');

# JSON_TYPE() 擷取參數并轉換json,傳回對應的類型
SELECT JSON_TYPE('["a", "b", 1]');
SELECT JSON_TYPE('"hello"');

# JSON_OBJECT() 插入json對象  必須使用反斜杠轉義每個引用字元
INSERT INTO t1 VALUES (JSON_OBJECT("mascot", "Our mascot is a dolphin named \"Sakila\"."));
#當直接插入 json時,需要使用雙反斜杠,
INSERT INTO t1 VALUES ('{"mascot": "Our mascot is a dolphin named \\"Sakila\\"."}');

SELECT jdoc FROM t1;
           
MariaDB 和 mysql 對于JSON資料存儲處理對比

條件查詢,沒問題: 

SELECT jdoc FROM t1 t where t.jdoc -> '$.mascot' LIKE '%O%';
           
MariaDB 和 mysql 對于JSON資料存儲處理對比

還有很多其他的功能,大家可以去官網了解,目前為止,我需要的功能有了,開始寫代碼啦