生产上面有一条sql查询很慢,需要7到8秒左右,简化之后的sql如下所示:

SELECT

mingxi.*

FROM

(

SELECT

btjc01.id,

department.`name` AS btjc01011,

btjc01011 AS obj,

btjc01.inibeginmonth AS beginYearMonth,

lsbtsj.btje AS btjc01030,

CASE

WHEN btjc01.inibeginmonth ='2019-10' THEN

'是'

ELSE

'否'

END AS isadd

FROM

btjc01

INNER JOIN department ON department.Id = btjc01.btjc01038

INNER JOIN lsbtsj ON lsbtsj.btrid = btjc01.Id

WHERE

btjc01.btjc01037 = '3'

AND btjc01046 ='江西省'

AND btjc01047 ='九江市'

AND btjc01048 ='修水县'

AND lsbtsj.btqsyf <='2019-10'

AND lsbtsj.btjzyf >='2019-10'

AND beginYearMonth != inibeginmonth

UNION ALL

SELECT

btjc01.id,

department.`name` AS btjc01011,

btjc01011 AS obj,

btjc01.beginYearMonth,

btjc01.btjc01030,

CASE

WHEN btjc01.inibeginmonth ='2019-10' THEN

'是'

ELSE

'否'

END AS isadd

FROM

btjc01

INNER JOIN department ON department.Id = btjc01.btjc01038

INNER JOIN btgg03 ON btgg03.Id = btjc01.btjc01040

WHERE

btjc01.btjc01037 = '3'

AND btjc01046 ='江西省'

AND btjc01047 ='九江市'

AND btjc01048 ='修水县'

AND (beginYearMonth <='2019-10')

) AS mingxi

LIMIT 100,200;

执行计划如下所示:

可以看到 执行计划里面出现了 Using intersect,btjc01046 btjc01048 btjc01037 btjc01047 多个索引来进行数据的过滤。

另外发现一个问题,里面的 union all 子查询 却只需要 0.4秒就可以执行完成:

SELECT

btjc01.id,

department.`name` AS btjc01011,

btjc01011 AS obj,

btjc01.inibeginmonth AS beginYearMonth,

lsbtsj.btje AS btjc01030,

CASE

WHEN btjc01.inibeginmonth ='2019-10' THEN

'是'

ELSE

'否'

END AS isadd

FROM

btjc01

INNER JOIN department ON department.Id = btjc01.btjc01038

INNER JOIN lsbtsj ON lsbtsj.btrid = btjc01.Id

WHERE

btjc01.btjc01037 = '3'

AND btjc01046 ='江西省'

AND btjc01047 ='九江市'

AND btjc01048 ='修水县'

AND lsbtsj.btqsyf <='2019-10'

AND lsbtsj.btjzyf >='2019-10'

AND beginYearMonth != inibeginmonth

UNION ALL

SELECT

btjc01.id,

department.`name` AS btjc01011,

btjc01011 AS obj,

btjc01.beginYearMonth,

btjc01.btjc01030,

CASE

WHEN btjc01.inibeginmonth ='2019-10' THEN

'是'

ELSE

'否'

END AS isadd

FROM

btjc01

INNER JOIN department ON department.Id = btjc01.btjc01038

INNER JOIN btgg03 ON btgg03.Id = btjc01.btjc01040

WHERE

btjc01.btjc01037 = '3'

AND btjc01046 ='江西省'

AND btjc01047 ='九江市'

AND btjc01048 ='修水县'

AND (beginYearMonth <='2019-10')

执行计划如下:

比较一下前面和后面两个的执行计划,可以发现 都是有了 Using intersect 但是呢后面一个却只需要0.4秒,而在外面加上一层 select * from t,时间却需要7到8秒。一直没有明白什么原因。

最后的优化是去掉 Using interset ,使用 force index 手动指定使用索引 btjc01048:

SELECT

mingxi.*

FROM

(

SELECT

btjc01.id,

department.`name` AS btjc01011,

btjc01011 AS obj,

btjc01.inibeginmonth AS beginYearMonth,

lsbtsj.btje AS btjc01030,

CASE

WHEN btjc01.inibeginmonth ='2019-10' THEN

'是'

ELSE

'否'

END AS isadd

FROM

btjc01 force index(btjc01048)

INNER JOIN department ON department.Id = btjc01.btjc01038

INNER JOIN lsbtsj ON lsbtsj.btrid = btjc01.Id

WHERE

btjc01.btjc01037 = '3'

AND btjc01046 ='江西省'

AND btjc01047 ='九江市'

AND btjc01048 ='修水县'

AND lsbtsj.btqsyf <='2019-10'

AND lsbtsj.btjzyf >='2019-10'

AND beginYearMonth != inibeginmonth

UNION ALL

SELECT

btjc01.id,

department.`name` AS btjc01011,

btjc01011 AS obj,

btjc01.beginYearMonth,

btjc01.btjc01030,

CASE

WHEN btjc01.inibeginmonth ='2019-10' THEN

'是'

ELSE

'否'

END AS isadd

FROM

btjc01 force index(btjc01048)

INNER JOIN department ON department.Id = btjc01.btjc01038

INNER JOIN btgg03 ON btgg03.Id = btjc01.btjc01040

WHERE

btjc01.btjc01037 = '3'

AND btjc01046 ='江西省'

AND btjc01047 ='九江市'

AND btjc01048 ='修水县'

AND (beginYearMonth <='2019-10')

) AS mingxi

LIMIT 100,200;

执行时间需要1.2秒左右,和0.4秒相比,还是有差距。执行计划如下;

可以看到没有了 Using interset. 我们强制使用索引 btjc01048.

总结:

如果出现 Using interset 需要注意是否mysql优化器选择的是否是最佳的索引方案。是否可以通过force index来选择更优的索引。

mysql useing查询_MySQL查询优化一例——也说说 Using intersect相关推荐

  1. mysql useing查询_mysql explain语法详解--优化你的查询

    先解析一条sql语句,看出现什么内容 EXPLAINSELECTs.uid,s.username,s.name,f.email,f.mobile,f.phone,f.postalcode,f.addr ...

  2. mysql 关联查询_Mysql查询优化器,再也不会因为该什么时候建立索引发愁了

    优化器的作用: 我们知道,一条SQL语句,可以有很多执行方式,最后都返回相同的结果,而优化器的作用就是找到最好的执行计划. 一.RBO-基于规则的优化器(rule) 系统内置的一套硬编码规则,根据规则 ...

  3. mysql intersect 使用方法_MySQL查询优化一例——也说说 Using intersect

    生成上面有一条sql查询很慢,需要7到8秒左右,简化之后的sql如下所示: SELECT mingxi.* FROM ( SELECT btjc01.id, department.`name` AS ...

  4. mysql多线程查询_MySQL 利用多线程提升查询性能的一种思路

    转载自:http://dinglin.iteye.com/blog/1432443 背景 报表统计类的查询是一类耗时的查询.使用场景是QPS并不大,单每个查询由于需要访问较多数据,对大量数据做处理,执 ...

  5. mysql 关联查询_mysql数据库调优(二)

    第五.查询优化 1.查询慢的原因:网络因素.CPU.IO.上下文切换.系统调用.生成统计信息.锁等待时间等 2.优化数据库访问:查询性能地下的原因是访问的数据太多,某些查询不可避免的需要筛选大量的数据 ...

  6. java mysql 分页查询_MySQL分页查询方法及优化

    当数据库的数据量很大时,一次性查询结果就会变得很慢,为了提高查询效率,我们可以使用MySQL的分页查询功能.本文就为大家带来MySQL分页查询方法及优化. 推荐阅读: 分页查询方法: 在MySQL中, ...

  7. mysql商品查询_mysql的查询、子查询及连接查询(商城查询常用)

    一.mysql查询的五种子句 where(条件查询).having(筛选).group by(分组).order by(排序).limit(限制结果数) 1.where常用运算符: 比较运算符 > ...

  8. mysql客户端查询_MySQL数据库之利用mysql客户端查询UCSC数据库

    本文主要向大家介绍了MySQL数据库之利用mysql客户端查询UCSC数据库 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. UCSC Genome Browser是由Unive ...

  9. 分析mysql慢查询_mysql慢查询的分析方法_MySQL

    本文主要介绍的是MySQL慢查询分析方法,前一段日子,我曾经设置了一次记录在MySQL数据库中对慢于1秒钟的SQL语句进行查询.想起来有几个十分设置的方法,有几个参数的名称死活回忆不起来了,于是重新整 ...

最新文章

  1. 系统策略禁止安装python_Win10系统如何禁止自动安装捆绑软件?
  2. linux 和 windows 上printf 的不同
  3. python学习笔记之集合
  4. 【前端】Github Pages 与域名关联简明教程
  5. sql union 和 union all
  6. DVWA 黑客攻防演练(十二) DOM型 XSS 攻击 DOM Based Cross Site Scripting
  7. 微信公众号 被关注回复和关键词回复
  8. 1. 2020年《DeepMind&UCL深度学习讲座》第1讲:机器学习和AI入门【中文字幕】
  9. ME3616-OPENCPU完整调试笔记
  10. CST——贴片天线仿真
  11. 跟李沐学AI:实用机器学习 | 第一章
  12. Linux-磁盘扩容(逻辑卷方式)
  13. jquery方法之append()与appendto()
  14. 2012年10月底的家乡
  15. R实战| 雷达图(Radar Chart)
  16. android 键盘设置详解
  17. JavaScript中的拖拽事件且限制出界
  18. 观视界Grandvision EDI项目案例
  19. 顶点计划换位思考汇总
  20. Cookie&Session

热门文章

  1. 微信小程序:扫描身份证读取身份信息
  2. DICTATOR第三周栈与队列作业
  3. 解决Couldn‘t determine repo type for URL
  4. 微秒级别的网络延迟检测
  5. 消息通知的三种方式总结
  6. CTFd+CTFd-whale动态靶机环境搭建
  7. 微信公众号平搜索排名,如何让公众号搜索排名靠前,公众号文章关键词排名规则
  8. 今天介绍一款事半功倍的Maya插件包
  9. vue中防止按钮重复点击提交的方法
  10. 金蝶生成凭证模板_【干货】金蝶云ERP教你凭证模版的引入引出