随手记录一下工作解决问题的方法
主表A数据量级百万以上 子表B中有三个非主键字段需要跟主表A中三个非主键字段进行比对,任意一个字段比对成功即可,子表C中主键ID关联子表B中一个字段,一开始的时候想法很简单三个字段用or连接一下查询就OK了,如下:

select a.*,
from A a
left outer join B b on (( b.字段1 = a.字段1 and length(b.字段1)>6 )
or ( b.字段2 = a.字段2 and length(b.字段2)>6)
or (b.字段3 = a.字段3 and length(b.字段3)>6 ))
left outer join C c on c.id = b.cc_id
where to_char(to_char(df.declare_time,'yyyy-mm-dd')::timestamp + '365 day', 'yyyy-mm-dd') >= to_char(now()::timestamp,'yyyy-mm-dd')

实际去库里查询了一下,发现用时真的很恐怖,这种毫无优化的循环嵌套算法,达到了600多秒,后来多方查证之后,决定使用视图方式进行数据的查询,如下:

>  SELECT A表字段逐个写出    FROM ((A a
>      LEFT JOIN B b ON ((((b.字段1)::text = (a.字段1)::text) AND (length((b.字段1)::text) > 6))))
>      LEFT JOIN C c ON (((c.id)::text = (b.cc_id)::text)))   WHERE ((length((b.字段1)::text) > 6) AND (to_char(((to_char(c.declare_time,
> 'yyyy-mm-dd'::text))::timestamp without time zone + '365
> days'::interval), 'yyyy-mm-dd'::text) >= to_char((now())::timestamp
> without time zone, 'yyyy-mm-dd'::text))) UNION  SELECT A表字段逐个写出
> FROM ((A a
>      LEFT JOIN B b ON ((((b.字段2)::text = (a.字段2)::text) AND (length((b.字段2)::text) > 6))))
>      LEFT JOIN C c ON (((c.id)::text = (b.cc_id)::text)))   WHERE ((length((b.字段2)::text) > 6) AND (to_char(((to_char(c.declare_time,
> 'yyyy-mm-dd'::text))::timestamp without time zone + '365
> days'::interval), 'yyyy-mm-dd'::text) >= to_char((now())::timestamp
> without time zone, 'yyyy-mm-dd'::text))) UNION  SELECT A表字段逐个写出
> FROM ((A a
>      LEFT JOIN B b ON ((((b.字段3)::text = (a.字段3)::text) AND (length((b.字段3)::text) > 6))))
>      LEFT JOIN C c ON (((c.id)::text = (b.cc_id)::text)))   WHERE ((length((b.字段3)::text) > 6) AND (to_char(((to_char(c.declare_time,
> 'yyyy-mm-dd'::text))::timestamp without time zone + '365
> days'::interval), 'yyyy-mm-dd'::text) >= to_char((now())::timestamp
> without time zone, 'yyyy-mm-dd'::text)))

视图创建使用SQL,如下:

> CREATE VIEW view_test as select a.* from A a  left outer join B b on
> (b.字段1 = a.字段1 and length(b.字段1)>6) left outer join C c on c.id =
> b.cc_id where length(b.字段1)>6 and
> to_char(to_char(c.declare_time,'yyyy-mm-dd')::timestamp + '365 day',
> 'yyyy-mm-dd') >= (to_char(now()::timestamp,'yyyy-mm-dd'))

使用一个字段条件创建后,使用UNION连接了剩余两个字段的语句,应用视图后查询用时仅需1.8s,但是在项目Mapper映射中使用,要稍稍慢一些,不过比之前600s直接中断服务连接要强的多。

总结一下:
1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:

select id from t where num is null

3.应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描。
4.应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描。

建表时字段类型选择:
A:尽量使用TINYINT、SMALLINT、MEDIUM_INT作为整数类型而非INT,如果非负则加上UNSIGNED
B:VARCHAR的长度只分配真正需要的空间
C:使用枚举或整数代替字符串类型
D:尽量使用TIMESTAMP而非DATETIME
E:单表不要有太多字段,建议在20以内
F:避免使用NULL字段,很难查询优化且占用额外索引空间

大数据量查询视图应用相关推荐

  1. 大数据量查询:流式查询与游标查询

    最近在做一个计算相关的功能,大体就是有很多条SQL,每条SQL都涉及复杂地运算,最后要将所有计算结果进行合并分析.经初步测试,每个SQL起码会查出几十万条记录,我们现在有毛毛多的这种SQL. 最大的问 ...

  2. 高并发的大数据量查询导致系统频繁死机

    我们的大数据量查询是数据库分页的, 但是导出和打印功能是基于全部数据的. 系统投入使用后,对于导出和打印功能的使用远远要高于我们的预期. 而我们的系统的硬件设备是有限的 不能再升级了. 抓取内存大对象 ...

  3. 一次mysql大数据量查询 慢查询导致服务阻塞后的学习

    场景还原:前一个月给朋友写了个简单的登录功能,简单的查询数据库登录逻辑,使用mysbatis-plus进行的dao层代码生成(吐槽一下这个工具,真是方便一时爽,后面维护难,比较喜欢自己能够组装和优化s ...

  4. 大数据量查询解决方案

    1. java.lang.OutOfMemoryError: GC overhead limit exceeded 报错: 代码: 场景:当sql查询量过大时,切断任务,但是造成上述错误 解决方案: ...

  5. MyBatis Plus 解决大数据量查询慢问题

    分享知识 传递快乐 大数据量操作的场景大致如下: 数据迁移 数据导出 批量处理数据 在实际工作中当指定查询数据过大时,我们一般使用分页查询的方式一页一页的将数据放到内存处理.但有些情况不需要分页的方式 ...

  6. 优化大数据量查询方案——SpringBoot(Cloud)整合ES

    一.Elasticsearch简介 实际业务场景中,多端的查询功能都有很大的优化空间.常见的处理方式有:建索引.建物化视图简化查询逻辑.DB层之上建立缓存.分页-然而随着业务数据量的不断增多,总有那么 ...

  7. 搞懂 SQL 查询优化原理分析,秒速处理大数据量查询

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 有一张财务流水表,未分库分表,目前的数据量为9555695,分页查询使用到 ...

  8. key redis 遍历_快乐运维Redis大数据量查询与清理

    一. keys命令(生产环境禁止使用) 简单粗暴,由于Redis单线程这一特性,keys命令是以阻塞的方式执行的,keys是以遍历的方式实现的复杂度是 O(n),Redis库中的key越多,查找实现代 ...

  9. oracle大数据量查询超时排查

    首先声明,为实际项目中用到技术,绝非水文,手打不易,禁止抄袭!!!!!! 项目背景,做的是银行项目,ods实时查询接口,java开发接口,数据库为Oracle 19c.最近生产运维反馈,手机银行查询个 ...

最新文章

  1. php中的核心函数有哪些,PHP内核探索:函数的分类
  2. 【转】c#委托与事件
  3. 【深度学习】同款商品识别的克星--ArcFace!
  4. java idle,java – IMAP IDLE库
  5. Web安全学习Week5
  6. 阿里云服务器 搭建单体redis 以及踩坑
  7. oracle 9i hwm,Oracle 10g HWM原理及性能优化
  8. MySQL增量备份及恢复
  9. 转android项目开发 工作日志 2011.10.8--toast消息框使用
  10. 版权所有LIKEWING_柳我借地存个图学习一下
  11. 安装centos7 Minimal后 开启远程SSH
  12. cvc-complex-type.2.3: Element 'beans' cannot have character [children] 博客分类: Spring
  13. Q:How to read attribute from a tag
  14. 整理了 47 个 Python 人工智能库
  15. 校园歌手信息评分系统(C语言),大一新生期末实训
  16. python获取主板序列号_LabVIEW获取主板序列号和硬盘序列号以进行软件加密
  17. 23 种设计模式的通俗解释,虽然有点污,但是秒懂
  18. 中国式家长计算机科学家攻略,中国式家长特长图鉴一览表 Q版图表讲解各特长发展路线...
  19. Java毕设项目大学生创业众筹系统(java+VUE+Mybatis+Maven+Mysql)
  20. 信息管理导论 | 信息与信息资源、信息社会

热门文章

  1. 深度学习论文: Cultivated Land Extraction from High-Resolution Remote Sensing Image
  2. OverTheWire-Bandit
  3. 《博弈心理学》-占据主动的策略思维
  4. linux更新网卡驱动
  5. pdf压缩工具怎么用?如何压缩pdf
  6. 软考 - 10 智能家居管理系统
  7. 01:行业介绍、虚拟化技术、Win系统安装
  8. Android App支付系列(二):支付宝SDK接入详细指南(附官方支付demo)
  9. ps的选区和相关工具
  10. Splatter Painting