首页 > 数据库 >MySQL 允许你在 JSON 数据上创建索引

MySQL 允许你在 JSON 数据上创建索引

时间:2024-09-03 09:54:39浏览次数:6  
标签:name course 索引 JSON student MySQL courses id

MySQL 允许你在 JSON 数据上创建索引

测试用例

CREATE TABLE `student` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `age` int DEFAULT NULL,
  `courses` json DEFAULT NULL,
  `address` json DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;


INSERT INTO student (name, age, courses, address) VALUES
('张伟', 20, '[{"credits": 3.0, "course_id": "CS101", "course_name": "计算机基础"}, {"credits": 4.0, "course_id": "MATH202", "course_name": "高等数学"}]', '{"zip": "100000", "city": "北京", "state": "北京市", "street": "北京市朝阳区幸福路123号"}'),
('李娜', 22, '[{"credits": 3.0, "course_id": "BIO301", "course_name": "生物学基础"}]', '{"zip": "200000", "city": "上海", "state": "上海市", "street": "上海市浦东新区花园路456号"}');


mysql> select * from student\G;
*************************** 1. row ***************************
     id: 1
   name: 张伟
    age: 20
courses: [{"credits": 3.0, "course_id": "CS101", "course_name": "计算机基础"}, {"credits": 4.0, "course_id": "MATH202", "course_name":
 "高等数学"}]address: {"zip": "100000", "city": "北京", "state": "北京市", "street": "北京市朝阳区幸福路123号"}
*************************** 2. row ***************************
     id: 2
   name: 李娜
    age: 22
courses: [{"credits": 3.0, "course_id": "BIO301", "course_name": "生物学基础"}]
address: {"zip": "200000", "city": "上海", "state": "上海市", "street": "上海市浦东新区花园路456号"}
2 rows in set (0.00 sec)


需求:

在student表的courses字段中,为JSON数据内的course_id键创建索引。

-- 创建函数索引
ALTER TABLE student
ADD INDEX idx_course_id ((CAST(courses->'$[*].course_id' AS CHAR(50) ARRAY)));
mysql> -- 可以看到已经用到索引
mysql> EXPLAIN SELECT * FROM student
    -> WHERE JSON_CONTAINS(courses->'$[*].course_id', '"CS101"')\G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: student
   partitions: NULL
         type: range
possible_keys: idx_course_id
          key: idx_course_id
      key_len: 203
          ref: NULL
         rows: 1
     filtered: 100.00
        Extra: Using where
1 row in set, 1 warning (0.00 sec)


上述的方式是通过MySQL 8.0 创建函数索引解决。

那么 MySQL 5.7  如何在 JSON 数据上创建索引?

答:使用虚拟列+全文索引:

-- 添加一个虚拟列
ALTER TABLE student
ADD COLUMN course_ids varchar(50) GENERATED ALWAYS AS 
(CONCAT_WS(' ', JSON_UNQUOTE(JSON_EXTRACT(courses, '$[*].course_id')))) STORED;
-- 创建全文索引
ALTER TABLE student
ADD FULLTEXT INDEX idx_course_ids (course_ids) WITH PARSER ngram; 
mysql> -- 使用全文搜索
mysql> EXPLAIN SELECT * FROM student
    -> WHERE MATCH(course_ids) AGAINST ('CS101' IN BOOLEAN MODE)\G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: student
   partitions: NULL
         type: fulltext
possible_keys: idx_course_ids
          key: idx_course_ids
      key_len: 0
          ref: const
         rows: 1
     filtered: 100.00
        Extra: Using where; Ft_hints: no_ranking
1 row in set, 1 warning (0.00 sec)


结论

JSON 数据类型是在 MySQL 中存储 JSON 数据的好方法。 它提供验证功能,允许创建索引,并使用 JSON 函数操作 JSON 数据。 它是 TEXT 数据类型的最佳替代品。



标签:name,course,索引,JSON,student,MySQL,courses,id
From: https://blog.51cto.com/hcymysql/11906175

相关文章

  • mysql创建数据库和表
    MySQL数据库与表的创建:结合具体案例分析MySQL是一种开源的关系型数据库管理系统(RDBMS),广泛应用于各种数据密集型的应用程序中。在数据库设计中,创建数据库和表是基础且关键的一步。本文将结合具体案例,详细分析如何在MySQL中创建数据库和表。一、创建数据库在MySQL中,创建数据库......
  • MySQL外键使用详解
    一、基本概念1、MySQL中“键”和“索引”的定义相同,所以外键和主键一样也是索引的一种。不同的是MySQL会自动为所有表的主键进行索引,但是外键字段必须由用户进行明确的索引。用于外键关系的字段必须在所有的参照表中进行明确地索引,InnoDB不能自动地创建索引。2、外键可以是一对......
  • MySQL视图(view)
    一、基本概念视图是一个虚拟表,是sql的查询结果,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据,在使用视图时动态生成。视图的数据变化会影响到基表,基表的数据变化也会影响到视图[insertupdatedelete];创建视图需要createview权限,并且对于查询涉及的......
  • 数据库守护者:揭秘MySQL组复制的高可用魔法
    mysql高可用之组复制(MGR)(数据库守护者:揭秘MySQL组复制的高可用魔法)什么是MySQLGroupReplication?MySQLGroupReplication是一个基于组通信的复制解决方案,它允许将多个MySQL实例组织成一个组,在该组内进行事务的一致性复制。这样可以确保即使某个实例发生故障,其他实例......
  • MySQL多表查询
    目录等值连接单表等值连接表别名多表等值连接自然连接USINGONUSING和ON的区别自连接外连接1.左外连接 LEFTOUTERJOIN2.右外连接 RIGHTOUTERJOIN子查询单行子查询多行子查询相关子查询EXISTS等值连接单表等值连接SELECT表名1.列名1,表名2.列名2FR......
  • 详细分析MySQL事务日志(redo log和undo log)
    innodb事务日志包括redolog和undolog。redolog是重做日志,提供前滚操作,undolog是回滚日志,提供回滚操作。undolog不是redolog的逆向过程,其实它们都算是用来恢复的日志:1.redolog通常是物理日志,记录的是数据页的物理修改,而不是某一行或某几行修改成怎样怎样,它用来恢复提交后的......
  • MySQL 基础命令
    目录一、MySQL简介1.MySQL的主要特点包括2.MySQL的主要用途包括:二、MySQL基础命令1.基本操作1.1进入1.2选择数据库1.3修改密码1.4所有命令后面都要加“;”2.创建2.1创建数据库2.2创建数据表2.3常见字段3.修改/更新3.1添加表字段3.2删除表字段......
  • 基于centos7.5安装mysql8
    @目录环境初始化部署mysql配置主从报错问题解决重启集群操作环境初始化mysql官网下载使用环境VMware17,centos7.5节点IPmysql01192.168.200.20mysql02192.168.200.21初始化两台节点;免密,主机名,主机映射等viinit.sh#!/bin/bash#定义节点信息NODES=("1......
  • 如何用MySQL设计一个高效的关系数据库架构
    如何用MySQL设计一个高效的关系数据库架构设计一个高效的关系数据库架构是确保数据库性能、可维护性和扩展性的关键。一个良好的数据库设计不仅能够提高查询效率,还能减少数据冗余,降低维护成本。以下将详细介绍如何用MySQL设计一个高效的关系数据库架构,包括设计原则、规范......
  • 第十讲:怎么给字符串字段加索引?
    第十讲:怎么给字符串字段加索引?​ 现在,几乎所有的系统都支持邮箱登录,如何在邮箱这样的字段上建立合理的索引,是我们今天要讨论的问题。总概类似邮箱登录系统的长表索引假设,你现在维护一个支持邮箱登录的系统,用户表是这么定义的:mysql>createtableSUser(IDbigintunsigned......