作者:ShunWah
在运维管理领域,我拥有多年深厚的专业积累,兼具坚实的理论基础与广泛的实践经验。我始终站在技术前沿,致力于推动运维自动化,不懈追求运维效率的最大化。
我精通运维自动化流程,对于OceanBase、MySQL等多种数据库的部署与运维,具备从初始部署到后期维护的全链条管理能力。凭借OceanBase的OBCA和OBCP认证、OpenGauss社区认证结业证书,以及崖山DBCA、亚信AntDBCA、翰高HDCA、GBase 8a | 8c | 8s、Galaxybase GBCA、Neo4j Graph Data Science Certification、NebulaGraph NGCI & NGCP等多项权威认证,我不仅展现了自己的专业技能,也彰显了对技术的深厚热情与执着追求。
在OceanBase & 墨天轮的技术征文大赛中,我凭借卓越的技术实力和独特的见解,多次荣获一、二、三等奖。同时,在OpenGauss第五届、第六届、第七届技术征文大赛,TiDB社区第三届专栏征文大赛,金仓数据库有奖征文活动,以及首批YashanDB「产品体验官」尝鲜征文等活动中,我也屡获殊荣。此外,我还活跃于墨天轮、CSDN等技术平台,经常发布原创技术文章,并多次被首页推荐,积极与业界同仁分享我的运维经验和独到见解。
前言
在现代Web开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,由于其易于阅读和写入、格式灵活的特点,得到了广泛的应用。MySQL 8.0版本中对JSON数据类型的支持进行了显著的增强,包括更高效的存储、索引和查询功能,使得MySQL成为处理非结构化数据的理想选择。

一、JSON数据类型的引入
在MySQL 8.0中,正式引入了JSON数据类型,允许用户将JSON对象直接存储在数据表中。这一改变避免了将JSON字符串存储在VARCHAR或TEXT字段中可能带来的性能问题,提供了更为高效的存储和查询性能。
1、进入use tutorialdb数据库
bash-5.1# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 8.0.40 MySQL Community Server - GPL
Copyright (c) 2000, 2024, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| tutorialdb |
+--------------------+
5 rows in set (0.01 sec)
mysql> use tutorialdb
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql>

2、创建包含JSON列的表:
mysql> CREATE TABLE person (
-> id INT AUTO_INCREMENT PRIMARY KEY,
-> data JSON
-> );
Query OK, 0 rows affected (0.02 sec)
mysql>

二、JSON函数的扩展
MySQL 8.0引入了一系列新的JSON函数,用于高效地查询和修改JSON数据。这些函数包括JSON_EXTRACT、JSON_SET、JSON_REPLACE和JSON_REMOVE等,它们允许用户在不解析整个JSON对象的情况下对JSON数据进行操作。
1、插入JSON数据:
mysql> INSERT INTO person (data) VALUES ('{"name": "Alice", "age": 30}');
Query OK, 1 row affected (0.01 sec)
mysql>

2、查询JSON数据:
mysql> SELECT JSON_EXTRACT(data, '$.name') AS name FROM person;
+---------+
| name |
+---------+
| "Alice" |
+---------+
1 row in set (0.00 sec)
mysql>

3、更新JSON数据:
mysql> UPDATE person SET data = JSON_SET(data, '$.age', 31) WHERE id = 1;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql>

4、删除JSON数据中的键:
mysql> UPDATE person SET data = JSON_REMOVE(data, '$.name') WHERE id = 1;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql>

三、JSON索引的创建
为了提高JSON数据的查询性能,MySQL 8.0允许用户在JSON表达式上创建索引。这可以通过在生成的列上创建索引来实现,从JSON列中提取标量值,并在这些值上创建索引。
1、创建虚拟列和索引:
mysql> ALTER TABLE person
-> ADD COLUMN name VARCHAR(255) GENERATED ALWAYS AS (data->>'$.name'),
-> ADD INDEX idx_name (name);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql>

四、JSON聚合函数
MySQL 8.0还提供了一组聚合函数,用于将多个JSON对象合并为一个新的JSON对象。这些函数包括JSON_ARRAYAGG和JSON_OBJECTAGG,它们可以将JSON对象组合成数组或键值对对象。
1、使用JSON_ARRAYAGG聚合JSON对象:
mysql> SELECT JSON_ARRAYAGG(data) FROM person;
+---------------------+
| JSON_ARRAYAGG(data) |
+---------------------+
| [{"age": 31}] |
+---------------------+
1 row in set (0.00 sec)
mysql>

2、使用JSON_OBJECTAGG将JSON对象组合成键值对对象:
mysql> SELECT JSON_OBJECTAGG(id, data->>'$.name') FROM person;
+-------------------------------------+
| JSON_OBJECTAGG(id, data->>'$.name') |
+-------------------------------------+
| {"1": null} |
+-------------------------------------+
1 row in set (0.00 sec)
mysql>

五、性能优化及命令行操作
MySQL 8.0对JSON数据的存储进行了优化,采用了二进制格式来存储JSON值,允许对文档元素进行快速读取访问。这种优化减少了在读取JSON文档时重新解析文本的需要,提高了查询性能。
1、检查JSON表的存储格式:
MySQL 8.0默认使用压缩的二进制格式存储JSON数据,但你可以通过以下命令查看表的存储引擎和行格式,确保使用的是支持JSON优化的存储格式。
mysql> SHOW TABLE STATUS LIKE 'person';
+--------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+--------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+
| person | InnoDB | 10 | Dynamic | 1 | 16384 | 16384 | 0 | 16384 | 0 | 2 | 2024-12-17 10:14:00 | NULL | NULL | utf8mb4_general_ci | NULL | | |
+--------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+
1 row in set (0.01 sec)
mysql>

在输出中,查找Engine和Row_format字段,确保Engine为InnoDB(MySQL 8.0的默认存储引擎),Row_format为DYNAMIC或COMPRESSED(这两个格式都支持JSON数据的优化存储)。
2、优化表:
虽然MySQL会自动处理JSON数据的存储优化,但定期运行OPTIMIZE TABLE命令可以帮助回收未使用的空间,提高表的性能。
mysql> OPTIMIZE TABLE person;
+-------------------+----------+----------+-------------------------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+-------------------+----------+----------+-------------------------------------------------------------------+
| tutorialdb.person | optimize | note | Table does not support optimize, doing recreate + analyze instead |
| tutorialdb.person | optimize | status | OK |
+-------------------+----------+----------+-------------------------------------------------------------------+
2 rows in set (0.04 sec)
mysql>

3、分析表:
使用ANALYZE TABLE命令可以帮助MySQL收集关于表的统计信息,这些统计信息对于查询优化器来说是非常重要的,可以帮助它生成更有效的查询计划。
mysql>
mysql> ANALYZE TABLE person;
+-------------------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+-------------------+---------+----------+----------+
| tutorialdb.person | analyze | status | OK |
+-------------------+---------+----------+----------+
1 row in set (0.00 sec)
mysql>

总结:
综上所述,MySQL 8.0在JSON功能方面的增强使得它成为处理非结构化数据的强大工具。通过引入JSON数据类型、扩展JSON函数、允许创建JSON索引以及提供JSON聚合函数,并结合性能优化命令,MySQL 8.0为开发者提供了更加高效、灵活的方式来存储、索引和查询JSON数据。这些改进将有助于提高用户在处理JSON数据时的灵活性和效率,特别是在面向现代Web应用程序开发的场景中。




