暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL 8.0 JSON 功能增强:更高效的存储、索引和查询

原创 shunwah 2024-12-17
358

作者: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成为处理非结构化数据的理想选择。

image.png

一、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> 

image.png

2、创建包含JSON列的表:

mysql> CREATE TABLE person (
    ->     id INT AUTO_INCREMENT PRIMARY KEY,
    ->     data JSON
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> 

image.png

二、JSON函数的扩展

MySQL 8.0引入了一系列新的JSON函数,用于高效地查询和修改JSON数据。这些函数包括JSON_EXTRACTJSON_SETJSON_REPLACEJSON_REMOVE等,它们允许用户在不解析整个JSON对象的情况下对JSON数据进行操作。

1、插入JSON数据:

mysql> INSERT INTO person (data) VALUES ('{"name": "Alice", "age": 30}'); Query OK, 1 row affected (0.01 sec) mysql>

image.png

2、查询JSON数据:

mysql> SELECT JSON_EXTRACT(data, '$.name') AS name FROM person; +---------+ | name | +---------+ | "Alice" | +---------+ 1 row in set (0.00 sec) mysql>

image.png

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>

image.png

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>

image.png

三、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>

image.png

四、JSON聚合函数

MySQL 8.0还提供了一组聚合函数,用于将多个JSON对象合并为一个新的JSON对象。这些函数包括JSON_ARRAYAGGJSON_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>

image.png

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>

image.png

五、性能优化及命令行操作

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>

image.png

在输出中,查找EngineRow_format字段,确保EngineInnoDB(MySQL 8.0的默认存储引擎),Row_formatDYNAMICCOMPRESSED(这两个格式都支持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>

image.png

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>

image.png

总结:

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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论