##################### OS:CentOS 7 DB:mysql 5.7 时间:2019.06 ##################### 最近有一个项目遇到性能问题,我这里把优化的方法分享出来(这个方案并非谁独创,而是mysql 官方为实现函数索引的替代方法)。 问题是这样的:我们需要从一个JSON 字段中取出相应的项作为 where 子句的条件,如下:
CREATE TABLE `xxxxxx` ( `id` varchar(96) DEFAULT NULL, `gid` varchar(96) DEFAULT NULL, `user_id` varchar(900) DEFAULT NULL, `order_no` varchar(96) DEFAULT NULL, `request_time` varchar(96) DEFAULT NULL, `code` varchar(96) DEFAULT NULL, `msg` varchar(96) DEFAULT NULL, `request_conetent` text, `request_response` text, `product_code` varchar(600) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ##SQL如下: select id from table_name where json_extract(`request_conetent`,'$.vclN')='xxxxx'; +----+-------------+----------------+------------+------+---------------+------+---------+------+------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+----------------+------------+------+---------------+------+---------+------+------+----------+-------------+ | 1 | SIMPLE | xxxxxx | NULL | ALL | NULL | NULL | NULL | NULL | 85 | 100.00 | Using where | +----+-------------+----------------+------------+------+---------------+------+---------+------+------+----------+-------------+
大家都知道MYSQL不支持函数索引,那如何优化呢? MYSQL虽然不支持函数索引,但有一个替代方法:Generated Columns + index 代替函数索引
###在 request_record 表中添加一个计算列,并在该列上创建函数索引
alter table table_name add column carno varchar(100) generated always as (json_extract(`request_conetent`,'$.vclN')) VIRTUAL,add key idx_carno(carno);
#表结构如下:
CREATE TABLE `xxxxxx` (
`id` varchar(96) DEFAULT NULL,
`gid` varchar(96) DEFAULT NULL,
`user_id` varchar(900) DEFAULT NULL,
`order_no` varchar(96) DEFAULT NULL,
`request_time` varchar(96) DEFAULT NULL,
`code` varchar(96) DEFAULT NULL,
`msg` varchar(96) DEFAULT NULL,
`request_conetent` text,
`request_response` text,
`product_code` varchar(600) DEFAULT NULL,
`carno` varchar(100) GENERATED ALWAYS AS (json_extract(`request_conetent`,'$.vclN')) VIRTUAL,
KEY `idx_carno` (`carno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
# 用 新增加的计算列(carno)查询
mysql> explain select id from request_record where
carno
='xxxxxx';
+----+-------------+----------------+------------+------+---------------+-----------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+----------------+------------+------+---------------+-----------+---------+-------+------+----------+-------+
| 1 | SIMPLE | xxxxxxx | NULL | ref | idx_carno |
idx_carno
| 303 | const | 1 | 100.00 | NULL |
+----+-------------+----------------+------------+------+---------------+-----------+---------+-------+------+----------+-------+
从执行计划里可以看出,已经走索引了
编辑推荐:
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- MySQL高可用方案MHA的部署和原理
MySQL高可用方案MHA的部署和原理
26-03-01 - 云吞铺子:RDS for MySQL CPU性能问题分析第一篇
云吞铺子:RDS for MySQL CPU性能问题分析第一篇
26-03-01 - 3ds max制作立体效果的角斗士之王
3ds max制作立体效果的角斗士之王
26-03-01 - mysql用户创建
mysql用户创建
26-03-01 - 怎样通过以太网远程访问PLC 较简单的方法
怎样通过以太网远程访问PLC 较简单的方法
26-03-01 - mysql审核平台yearning及inception安装
mysql审核平台yearning及inception安装
26-03-01 - MySQL高可用方案MHA在线切换的步骤及原理
MySQL高可用方案MHA在线切换的步骤及原理
26-03-01 - 一条SQL语句在MySQL中如何执行的
一条SQL语句在MySQL中如何执行的
26-03-01 - SOAR的启发式规则建议
SOAR的启发式规则建议
26-03-01 - 数据库MySQL创建表定义主键 (新手必看)
数据库MySQL创建表定义主键 (新手必看)
26-03-01
