今天检查满查询日志发现有个存储过程查询可以达17S

而且是订单列表查询,这个当然不能忍了,必须优化,接下来就是查找原因优化过程。过程使用动态语句,首先使用满查询的语句条件提取出来静态语句单独分析:

提取结果如下:

table1 表数据100W+  table3表数据200W+

SELECTb.*,

A.value1,

A.value2,

A.value3,

A.value4,

A.value5,

A.value6,FROMtable1 bLEFT JOINtable2AON b.order_no = A.order_no AND b.channel_no =A.channel_noWHERE 1 = 1 AND EXISTS (SELECT

1

FROMtable3 tWHERE b.order_no = t.order_no AND t.ticket_no LIKE '%1792903240%')ORDER BY CREATE_TIME LIMIT 0, 20

为什么这个过程要10s+ 呢?

主要原因在于 exists这个部分,因为 table3有200W的数据,并且循环式和外表扫描查询,并且这里的like是不会走索引的,只能全扫描,所以慢就很明显了,由于是动态语句,并在存储过程中,所以优化就是拆解EXISTS这部分

主要思路就是 先从200W+ 的table3中查出来order_no 然后把order_no插入临时表,然后再使用in 临时表查询,减少关联扫描次数就能极大的优化查询时间

前提: table3中的ticket_no 重复率非常低,200W+的数据 有200W的非重复,为什么强调这个,临时表在处理少量数据时性能很优异,(一般只在确定不能用索引的时候才使用临时表,或者在存储过程中某些固定数据使用次数非常多的时候使用临时表,其他时候我一般不建议使用)

优化结果:

CREATE TEMPORARY TABLE tmp_order_no (ticket_order_no varchar(100));INSERT INTO tmp_order_no SELECT tp.order_no FROM t_passenger tp WHERE tp.ticket_no LIKE CONCAT('%',2903240,'%');SELECTb.*,

A.value1,

A.value2,

A.value3,

A.value4,

A.value5,

A.value6,FROMtable1 bLEFT JOINtable2AON b.order_no = A.order_no AND b.channel_no =A.channel_noWHERE 1 = 1 AND b.order_no IN (SELECT ticket_order_no FROMtmp_order_no)ORDER BY CREATE_TIME LIMIT 0, 20

DROP TEMPORARY TABLE IF EXISTS tmp_order_no;

优化后查询时间1.2S左右,速度提升十几倍,性能提升明显

mysql临时表多线程时能用吗_学会使用临时表优化,切记不要乱用临时表(记录一)...相关推荐

  1. mysql建表时建外键约束_数据库建表时一定要设置外键约束关系吗?

    如果被引用的表需要做分库分表,那么无法建立外键约束. 使用外键会降低数据库性能,这个说法并不细致.需要详细分析. 建立外键,那么一般引用字段上需要建立索引.如果不建立索引,被引用的表上删除数据,会全表 ...

  2. MySQL表sql语句增删查改_学会这些操作你就不会栓Q(狗头)

    目录 本章目标 CRUD 新增(Create) 单行数据,全列插入 多行插入,指定列插入 查询(Retrieve) 修改(Update) 删除(Delete) 本章目标 学会MySQL表中的sql语句 ...

  3. 计算日期跨度时如何过滤工作日_学会这3个函数,解决所有关于计算工作日的难题...

    每月到手的工资,到底应该交多少税?私信回复关键词[个税]获取Excel个税模板! 对于工作日的算法,我一直十分头大. 周末不能算,临时加班儿不能算,碰上节假日还有薛定谔的调休. 一个月下来,连自己上了 ...

  4. mysql_real_connect段错误,mysql的多线程安全问题:在mysql_real_connect时出现段错误。...

    问题简化重现 19 #include 20 #include 21 22 void* func(void* arg) 23 { 24 MYSQL* mysql = (MYSQL *)arg; 26 m ...

  5. mysql怎么删除临时表里的数据_谈谈MySQL数据库中临时表的应用

    MySQL在很多情况下都会用到临时表总结一下什么时候会用到临时表 什么是临时表MySQL用于存储一些中间结果集的表临时表只在当前连接可见当关闭连接时Mysql会自动删除表并释放所有空间. 以下讨论的是 ...

  6. mysql 字符串特殊字符_转:MySQL数据入库时特殊字符处理

    在一个字符串中,如果某个序列具有特殊的含义,每个序列以反斜线符号 ("\")开头,称为转义字符. MySQL 识别下列转义字符: \0 一个 ASCII 0 (NUL) 字符. \ ...

  7. mysql语法错误文件_使用logstash同步MySQL的数据时,在jdbc查询sql文件时报sql语法错误,sql文件是navicat生成的...

    使用logstash同步MySQL的数据时,在jdbc查询sql文件时报sql语法错误,并且错误总是near在第1行,sql文件的编码是utf8mb64 ,不知道是否是编码问题 logstash配置j ...

  8. mysql中以下正确的sql是_总结MySQL中SQL语法的使用

    --where子句操作符: where子句操作符 = 等于 <> 不等于(标准语法) != 不等于(非标准语法,可移植性差) < 小于 <= 小于等于 > 大于 > ...

  9. 多线程不重复读取数据_用 PHP 实现多线程编程

    (给PHP开发者加星标,提升PHP技能) 转自:腾讯云(枕边书) cloud.tencent.com/developer/article/1012783 1.前言 前些天帮同事查一个问题,第一次接触到 ...

  10. mysql 建表时建立索引_mysql 分享建表和索引的几点规范

    一. MySQL建表,字段需设置为非空,需设置字段默认值. 二. MySQL建表,字段需NULL时,需设置字段默认值,默认值不为NULL. 三. MySQL建表,如果字段等价于外键,应在该字段加索引. ...

最新文章

  1. 基于Linux GlassFish v3 配置取代tomcat
  2. Apple首篇AI文章,SimGAN
  3. html万年历闹钟怎么取消,万年历如何取消整点报时,他上面有四个键,分...
  4. 你的手机上未安装应用程序”的解决方案
  5. java压缩----使用ANT JDK压缩---解决中文问题
  6. Android studio之编译出现 Error:null value in entry: outputDirectory=null
  7. HtmlHelper扩展 及 页面编码化
  8. Linux—Ubuntu14.0.5配置JAVA环境
  9. 以太坊geth区块链私链建立
  10. 山西省职业技能鉴定计算机操作员(中级工)理论知识试卷,山西省职业技能鉴定统一试卷 中级...
  11. 15. Provide access to raw resources in resouce-managing classes
  12. redhat 5.4 搭建本地YUM源
  13. 【LAMMPS系列】LAMMPS安装WIN并行版
  14. 解决 googel 无法直接跳转网页打开搜索结果
  15. 传媒论坛杂志传媒论坛杂志社传媒论坛编辑部2022年第13期目录
  16. TOLUA的文件结构
  17. EXCEL的换行符等,输入,替换,和 char(10) char(13)等
  18. 手机怎么更改html打开方式,安卓如何更改文件打开方式?
  19. c语言表示时间的程序,C语言显示“当前时间”小程序
  20. ColorOS怎么切换Android,OPPO怎么升级ColorOS11 OPPO升级ColorOS11方法

热门文章

  1. tomcat6.0启动报错
  2. 代码实现UITableViewCell表视图单元定制
  3. 转帖:MySql日期格式化
  4. [声明]honkql大量密码被海空神佛团伙盗走
  5. java动态代理和Cglib动态代理的区别和使用
  6. EnglishWords——星期与月份
  7. swift流行UI库(github)
  8. 安装多个mysql实例(debian版本)
  9. xcode自动刷新resource下的文件
  10. SkewTransform