今天接到客户反馈,网站这两天经常出现无法访问的情况,查看日志发现是一个页面里的sql查询太慢,需要30多秒导致超时并且因为访问量多堵塞住了,导致其他页面也无法正常访问,所以对这个sql进行优化,下面介绍下优化过程。

这个查询是通过3个表来查询的,一个产品表(prod),两个别名表(synonym, synonym_cn),原来的SQL语句是这样的:

select id from prod where prod.id > 0 and (prod.cas = '72-44-6' or (exists (select 1 from synonym where prod.id = synonym.prod and lower(synonym.name) = '72-44-6')) or (exists (select 1 from synonym_cn where prod.id = synonym_cn.prod and lower(synonym_cn.name) = '72-44-6')))

其中prod.cas建了唯一索引,synonym和synonym_cn的name建了lower函数索引。prod的数量是64万,synonym和synonym_cn都是100多万。

分析后发现prod.cas并没有走索引,所以先去掉cas的查询条件进行测试,发现还是很慢,而name的搜索还会结合prod.id,所以重建了synonym和synonym_cn的name索引为联合索引,即prod和lower(name),但测试后效果依然不理想,所以讲索引改回,并将语句分成三个语句测试:

select id from prod where prod.cas = '72-44-6'

select prod from synonym where lower(synonym.name) = '72-44-6'

select prod from synonym_cn where lower(synonym_cn.name) = '72-44-6'

发现搜索速度都很快,所以讲整体语句改成

select id from prod where prod.id in (select b.id from prod b where b.cas = '72-44-6' union select prod from synonym where lower(synonym.name) = '72-44-6' union select prod from synonym_cn where lower(synonym_cn.name) = '72-44-6')

至此解决问题。

pg mysql 联表查询_postgresql多表查询语句优化相关推荐

  1. mysql between 查询不出来_mysql的语句优化

    (1)mysql避免全表扫描 1.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num i ...

  2. python postgresql跨数据库查询_Postgresql跨数据库查询

    postgres 跨数据库查询 dblink 的安装 linux #cd postgres源码安装目录/contrib/dblink # make # make install 注意: 如果你在安装了 ...

  3. (转)MySQL联表查询

    资料源于网络 一.内联结.外联结.左联结.右联结的含义及区别 在SQL标准中规划的(Join)联结大致分为下面四种: 1.内联结:将两个表中存在联结关系的字段符合联结关系的那些记录形成记录集的联结. ...

  4. 【explain】MySQL联表查询中的驱动表

    写在前面 1.不要求每个人一定理解 联表查询(join/left join/inner join等)时的mysql运算过程 2.不要求每个人一定知道线上(现在或未来)哪张表数据量大,哪张表数据量小 3 ...

  5. mysql联表查询语句示例

    mysql联表查询语句示例 ps:本人亲测,阿里云2核4G5M的服务器性价比很高,新用户一块多一天,老用户三块多一天,最高可以买三年,感兴趣的可以戳一下:阿里云折扣服务器 示例: "sele ...

  6. mysql联表查询count错误_关于count(*)和联表查询和锁表的问题

    刚开始学MySQL,在描述时候假如有不对的地方,希望各位大大指出. 本人在看书的时候看到了这么一句,在生产环境中请不要随意使用count(*),原因是它将会进行表级锁定(inno DB下). 原因是最 ...

  7. mysql联表查询多记录显示_数据库:MySQL(多表的表记录的查询)(三)

    一.外键约束 1.创建外键 ---每一个班主任会对应多个学生 , 而每个学生只能对应一个班主任----主表 CREATE TABLE ClassCharger( id TINYINT PRIMARY ...

  8. MySQL联表查询【详解】

    文章目录 MySQL连接查询及原理 1.本文内容 2.准备数据 3.笛卡尔积 sql中笛卡尔积语法 4.内连接 示例1:有连接条件 示例2:无连接条件 示例3:组合条件进行查询 总结 5.外连接 左连 ...

  9. mysql连表条件查询_mysql带条件查询,联表查询

    ---恢复内容开始---mysql 1,用于设定所select出来的数据是否容许出现重复行(彻底相同的数据行)sql all:容许出现--默认不写就是All(容许的).spa distinct:不容许 ...

最新文章

  1. 【深度学习】利用深度可分离卷积减小计算量及提升网络性能
  2. 八个JS中你见过的类型。
  3. 第二章:Java基本语法
  4. 沉浸式全息本是什么_“全息投影”走进健身房,打造沉浸式健身体验室,想来试试吗?...
  5. Mac iOS 允许从任何来源下载应用并打开
  6. 模态对话框与非模态对话的几种销毁方法与区别
  7. linux tee 重定向_快乐的linux命令行-重定向
  8. Java 监听器,国际化
  9. python中向类中动态添加新特性及删除属性方法
  10. 虚拟机安装mac os x实战
  11. 从入门到精通进阶篇 - 设置负载阶梯式压测场景(详解教程)
  12. druid监控页面_Spring boot学习(四)Spring boot整合Druid
  13. python高级编程总结
  14. C#-XML-数据传输
  15. linux中用户信息存储在,在linux中,用于存放用户信息的两个文件是/etc/passwd和/etc/shadow。()...
  16. linux运行getch吗,怎么样在linux下,实现getch函数功能
  17. mac/windows用Chrome浏览器截取长图
  18. 计算机工作月度个人总结怎么写,计算机*学生个人实习工作总结范文
  19. python培训费用一般多少
  20. Linux在虚拟机里大小写键不停闪动是因为虚拟机内外的大小写不同导致,将虚拟机内外的大小写切换一致即可解决

热门文章

  1. 从零开始搭建一个私有前端组件库
  2. 家长要学会对孩子放手,孩子才能成长得更独立
  3. JavaScript/jQuery/Vue实现飘窗功能
  4. 链表:判断链表是否有环以及找入口
  5. 2014/05/01 Android 各个版本, 屏幕尺寸, open GL 等 市场占有率
  6. linux c++贪吃蛇代码,贪食蛇源码c++
  7. oracle12520,升级Oracle RAC后出现ORA-12520错误
  8. ubuntu 22.04安装微信
  9. leetcode-8-String to Integer (atop)字符串转整数
  10. 在软件定义汽车的时代,低代码究竟给车企数字化转型带来了什么?