文章目录

  • 问题
  • 优化过程
  • SQL分析

问题

案例:项目中发现如下类似SQL,该查询语句非常低下,嵌套子查询

SELECT  info.* from   A  info  where  EXISTS (SELECT  b.id  FROM  B  b where  b.family_member  REGEXP  info.name AND b.`status`=0);

其中匹配的字段信息如下所示,是一组成员姓名,其中每个人信息是以逗号分割的。

在尝试使用like,join关联查询查询效率也很慢,尝试使用函数索引的方式但是因为是动态关联,函数参数是动态的也不适用。
在分析数据后发现单列数据虽然存在多个,但是数据的格式是固定的,即以逗号分割,这个逗号可能出现在开头,中间,结尾。于是想到了行转列的方式,以逗号进行拆分将数据进行转换,然后进行关联匹配。

优化过程

创建中间表help_topic_index表,如果不想创建可以直接使用mysql.help_topic。

CREATE TABLE `help_topic_index` (`help_topic_id` int(11) NOT NULL
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4;

构建表数据,就是从0开始的索引下标数据,这里最大设置1000的。


-- 创建测试存储过程,使用完注意删除
CREATE DEFINER=`root`@`%` PROCEDURE help_topic_index_call()
BEGINdeclare i int;  set i=0;while i<=1000 doinsert into help_topic_index(help_topic_id) values(i);set i=i+1;end while;
END-- 执行
call help_topic_index_call();

SQL分析

SUBSTRING_INDEX函数

SUBSTRING_INDEX(s, delimiter, number)

返回从字符串 s 的第 number 个出现的分隔符 delimiter 之后的子串。
1、如果 number 是正数,返回第 number 个字符左边的字符串。
1、如果 number 是负数,返回第(number 的绝对值(从右边数))个字符右边的字符串。

SELECT   a.name_list  原始数据, substring_index( a.name_list, ',', b.help_topic_id + 1 )  当前子串,substring_index( substring_index( a.name_list, ',', b.help_topic_id + 1 ), ',', - 1 )   解析结果  FROM ( SELECT ',张三,,李四,王五' as name_list     from dual  ) a INNER JOIN help_topic_index b on b.help_topic_id < ( length( a.name_list  ) - length( REPLACE ( a.name_list, ',', '' )) + 1 )


SQL分析:
【1】b.help_topic_id < ( length( a.name_list ) - length( REPLACE ( a.name_list, ‘,’, ‘’ )) + 1 ) 条件用于计算去除分割符后有多个组数据
【2】substring_index( a.name_list, ‘,’, b.help_topic_id + 1 ) 当前子串。通过help_topic_index中间表递增的序列值,通过substring_index依次得到子串数据
【3】上一步通过正向获取每一组子串,如上图所示前缀是一样的,所以每一次获取后缀的数据即可,这样就可以解析出最终的结果
【4】通过上面的SQL就可以获取到行转列的数据,然后将转换后的结果通过SQL精确匹配即可,在根据实际情况设置索引这样整体的查询效率就很快了。
【5】上面的案例中几十万的数据,原先的查询需要几十秒,优化后几毫秒内可以查询出结果。

SQL行转列方式优化查询性能实践相关推荐

  1. Navicat使用教程:使用Navicat Query Analyzer优化查询性能(第1部分)

    2019独角兽企业重金招聘Python工程师标准>>> 下载Navicat Monitor最新版本 Navicat Monitor 是一套安全.简单而且无代理的远程服务器监控工具.它 ...

  2. navicat 解析sql_使用 Navicat 查询分析器优化查询性能(第 1 部分)

    2018 年 12 月 24 日,由 Robert Gravelle 撰写 概览.最新的死锁查询以及进程列表页面 正如上几篇关于 MySQL/MariaDB 日志的文章中所提到的,数据库管理员(DBA ...

  3. SQL 行转列 列转行 Oracle转置函数函数pivot、unpivot 解决wm_concat 没有排序

    https://www.cnblogs.com/mellowsmile/p/4642306.html HH 终风且暴,顾我则笑,谑浪笑敖,中心是悼. 终风且霾,惠然肯来,莫往莫来,悠悠我思. 博客园 ...

  4. navicat 解析sql_使用 Navicat 查询分析器优化查询性能(第 2 部分)

    2018 年 12 月 31 日,由 Robert Gravelle 撰写 查询分析器部分 Navicat Monitor for MySQL/MariaDB的查询分析器工具提供了查询日志的图形表示, ...

  5. oracle 行转列sql语句,行转列(sql行转列)

    sql语句行转列?怎么转啊 select MIN(id) as ID, name, sex, sum(case when num=2 then 2 end) as num2, sum(case whe ...

  6. SQL——行转列,列转行

    重温SQL--行转列,列转行 行转列,列转行是我们在开发过程中经常碰到的问题.行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER 2005 新增的运算符PIVOT来实现. ...

  7. SQL行转列、列转行

    SQL行转列.列转行 这个主题还是比较常见的,行转列主要适用于对数据作聚合统计,如统计某类目的商品在某个时间区间的销售情况.列转行问题同样也很常见. 一.整理测试数据 create table wyc ...

  8. 使用case when,union all实现sql行转列、列转行

    以前有写过行转列,列转行的博客 具体见: https://blog.csdn.net/weixin_38653290/article/details/84639754 今天分享下使用case when ...

  9. 死磕:SQL行转列汇总(全网最全最详细)

    SQL行转列汇总 阅读目录 一. 基础语法: 二. 典型实例 一. 基础语法: PIVOT 用于将列值旋转为列名(即行转列),在 SQL Server 2000可以用聚合函数配合CASE语句实现 PI ...

最新文章

  1. .net下绘制统计图工具-请推荐
  2. ListT中,Remove和RemoveAt区别
  3. Shell之sed用法 转滴
  4. android studio无法新建工程,我刚刚升级了Android Studio3.3.2,但是我不能创建一个新的项目。这里是错误日志。我使用的开发语言是Java。...
  5. xgboost学习率不能大于1的原因
  6. Cocoa的MVC架构分析 cocoa的mvc实现
  7. 华为手机安装系统能换鸿蒙,华为鸿蒙将全面上线,安卓系统或将被彻底替换
  8. Linux搭建私有Git服务器以及ssh免密登陆配置
  9. matlab有模糊分析,用matlab进行模糊综合评判_模糊综合评判matlab
  10. 20145231 《信息安全系统设计基础》期中总结
  11. Ubuntu 下配置 NFS
  12. U盘PE安装windows7 方法
  13. Digix联合创始人:在接下来的12个月中 比特币将被称为真正的价值存储
  14. 微信小程序云开发教程-后端接口分析和接口返回值的格式定义
  15. Delphi 集合和字符串互转
  16. Java面试题总结(附答案)
  17. 应用商店应用计算机,应用市场电脑版
  18. fedora linux五笔输入法,教你在Fedora 14 下安装五笔输入法
  19. ORACLE错误编码大全
  20. 迈克尔·霍利:当我看到人们急着加入新行列、抛弃高度发展的老技术时,我就感到很伤心

热门文章

  1. 黑莓将入华,服务费用不菲
  2. 如何让VeryCD电驴下载完后,自动关机?
  3. java-net-php-python-jspm招警考试模拟题库计算机毕业设计程序
  4. 千峰培训_day15_Linux笔记
  5. 2021-07-16 python与HFSS联合仿真思路讲解(内附代码文件)
  6. 人工智能 —— 产生式推理
  7. 【扫盲】女孩暗示你可以和她上床的十种表示【原创】
  8. day14_雷神_前端02
  9. 为什么序列存在单位根是非平稳时间序列?
  10. 自学Java-day01(初学Java)