原来的sql是这样写的

 SELECT
d.ONSALE_BARCODE,
d.ONSALE_NAME,
c.ONSALE_ID,
CAST(
AVG(c.CUSTOMARY_PRICE) AS DECIMAL (18, 1)
) AS CUSTOMARY_PRICE,
CAST(
AVG(c.CONSTANT_PRICE) AS DECIMAL (18, 1)
) AS CONSTANT_PRICE,
CAST(
AVG(c.RETAIL_ITEM_PRICE) AS DECIMAL (18, 1)
) AS RETAIL_ITEM_PRICE,
CAST(
AVG(c.RETAIL_PACKAGE_PRICE) AS DECIMAL (18, 1)
) AS RETAIL_PACKAGE_PRICE
FROM
yzd_retailer a
LEFT JOIN sur_main b ON a.USER_ID = b.USER_ID
LEFT JOIN sur_main_sail c ON c.SUR_ID = b.SUR_ID
LEFT JOIN ret_on_sale d ON d.ONSALE_ID = c.ONSALE_ID
WHERE
a.RET_AREA IN (01, 10, 20, 30, 40, 50, 60)
AND a.RET_MARKET IN (0, 1)
AND a.RET_TYPE IN (0, 1, 2, 3, 4, 5, 6)
AND a.RET_SCALE IN (0, 1, 2)
AND c.sur_id IS NOT NULL
GROUP BY
c.ONSALE_ID

上面的sql执行需要60S,作为菜鸟的我以为无法优化了。结果在项目里跑的时候会出现504超时。。。让网站维护人员修改超时时间,结果没成功,眼看明天就要交了,这怎么行,于是只能预想着重新写方法了,不靠sql处理了。然而我并没有死心,觉得mysql应该可以再优化吧,不至于这几十万的数据就变得这么慢了,应该是我sql的问题,于是我就想方设法的改sql,突然想到,我应该试试先根据条件把零售户表筛选完,在放入关联查询。于是就做了如下修改

 SELECT
d.ONSALE_BARCODE,
d.ONSALE_NAME,
c.ONSALE_ID,
CAST(
AVG(c.CUSTOMARY_PRICE) AS DECIMAL (18, 1)
) AS CUSTOMARY_PRICE,
CAST(
AVG(c.CONSTANT_PRICE) AS DECIMAL (18, 1)
) AS CONSTANT_PRICE,
CAST(
AVG(c.RETAIL_ITEM_PRICE) AS DECIMAL (18, 1)
) AS RETAIL_ITEM_PRICE,
CAST(
AVG(c.RETAIL_PACKAGE_PRICE) AS DECIMAL (18, 1)
) AS RETAIL_PACKAGE_PRICE
FROM
(
SELECT
*
FROM
yzd_retailer
WHERE
RET_AREA IN (01, 10, 20, 30, 40, 50, 60)
AND RET_MARKET IN (0, 1)
AND RET_TYPE IN (0, 1, 2, 3, 4, 5, 6)
AND RET_SCALE IN (0, 1, 2)
) a,
sur_main b,
sur_main_sail c,
ret_on_sale d
WHERE
a.USER_ID = b.USER_ID
AND c.SUR_ID = b.SUR_ID
AND d.ONSALE_ID = c.ONSALE_ID
GROUP BY
c.ONSALE_ID

奇迹发生了,竟然只用了0.5S,真的是惊呆了,这差距也太大了吧。。。

总结:多表查询,在查询条件比较多的情况下,应该先在各个表内做筛选,将筛选之后的结果表再做关联查询。

记一次简单的SQL优化的更多相关文章

  1. 34条简单的SQL优化准则

    转载地址:http://bbs.csdn.net/topics/260002113 我们要做到不但会写SQL,还要做到写出性能优良的SQL,以下为笔者学习.摘录.并汇总部分资料与大家分享!(1)    ...

  2. mysql 简单的sql优化示例[不定时更新]

    对于慢sql的分析步骤: 1) desc|explain sql 查看执行计划, 对于type很慢的, 分析是否建立了对应字段的索引 2) 进行排除法, 把子查询抽离出来, 单独执行,定位慢查询是哪个 ...

  3. 记一次简单的sql注入

     什么是sql注入攻击?  所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令.在某些表单中,用户输入的内容直接用来构造(或者影 ...

  4. SQL优化:一些简单的又实用的SQL优化方案【转】

    面试过程中,面试官有极高的频率会问道数据库的优化,SQL语句的优化,网上关于SQL优化的教程很多,但是鱼目混杂,显得有些杂乱不堪.近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请 ...

  5. 其实SQL优化调优,就跟吃饭喝水一样简单,教你抓住SQL的本质!

    前言 SOL 优化并不简单,做好 SOL 优化需要掌握数据库体系结构.表和索引设计.高效 SOL法.高级 SOL 语法.多种优化工具等知识,甚至还得分析业务特点,以及了解优化器的缺点.只有建立 SOL ...

  6. oracle性能优化(项目中的一个sql优化的简单记录)

    在项目中,写的sql主要以查询为主,但是数据量一大,就会突出sql性能优化的重要性.其实在数据量2000W以内,可以考虑索引,但超过2000W了,就要考虑分库分表这些了.本文主要记录在实际项目中,一个 ...

  7. 记一次SQL优化

    常见的SQL优化 一.查询优化 1.避免全表扫描 模糊查询前后加%也属于全表扫描 在where子句中对字段进行表达式操作会导致引擎放弃使用索引而进行全表扫描,如: select id from t w ...

  8. 提高SQL查询效率(SQL优化)

    要提高SQL查询效率where语句条件的先后次序应如何写 http://blog.csdn.net/sforiz/article/details/5345359   我们要做到不但会写SQL,还要做到 ...

  9. sql优化(oracle)

    系统优化中很重要的方面是SQL语句的优化,对于海量数据,优质的SQL能够有效的提高系统的可用性. 总结的有点罗嗦,列个简单的目录啦~ 目录 第一部分知识准备                      ...

随机推荐

  1. [转载]从MyEclipse到IntelliJ IDEA-让你摆脱鼠标,全键盘操作

    从MyEclipse转战到IntelliJ IDEA的经历 注转载址:http://blog.csdn.net/luoweifu/article/details/13985835 我一个朋友写了一篇“ ...

  2. 在linux系统中安装VSCode(Visual Studio Code)

    在linux系统中安装VSCode(Visual Studio Code) 1.从官网下载压缩包(话说下载下来解压就直接可以运行了咧,都不需要make) 访问Visual Studio Code官网  ...

  3. css3盒模型

    css2.1盒模型: 当你定义盒子的宽高后:如果添加padding和border值后盒子的宽高会被撑大 盒子的高度=定义的高度+(padding-top + padding-bottom)+(bord ...

  4. linux2.6 内存管理——逻辑地址转换为线性地址(逻辑地址、线性地址、物理地址、虚拟地址)

    Linux系统中的物理存储空间和虚拟存储空间的地址范围分别都是从0x00000000到0xFFFFFFFF,共4GB,但物理存储空间与虚拟存储空间布局完全不同.Linux运行在虚拟存储空间,并负责把系 ...

  5. Linux驱动开发—— of_property_read_u8

    在使用設備樹的時候, 有時會遇到下面的問題. 在設備樹中配置的屬性如下: fusb301,init-mode = <0x20>; 但是在驅動中讀出的卻是: rc = of_property ...

  6. 2015游戏蛮牛——蛮牛杯第四届开发者大赛 创见VR未来开启报名

    蛮牛杯启动了,大家开始报名! http://cup.manew.com/ 这不是一篇普通的通稿,别着急忽略它.它是一篇可以让你梦想变现的通稿! 从某一天开始,游戏蛮牛就立志要为开发者服务,我们深知这一 ...

  7. Linux 系统命令笔记

    前言 翻出N年前学习笔记,感觉还有点用,放到博客备忘,自己查看用. 一. 系统命令笔记 1.系统 % /etc/issue           # 查看操作系统版本  %          # 观察系 ...

  8. Apworks框架实战(六):使用基于Entity Framework的仓储基础结构

    在前面的章节中,我们已经设计了一个简单的领域模型,接下来我们希望能够实现领域模型的持久化及查询.在Apworks中,实现了面向Entity Framework.NHibernate以及MongoDB的 ...

  9. App内测神器之蒲公英

    一.前言部分 没使用蒲公英之前一直采用非常傻B的方式给公司App做内部测试,要么发个测试包让公司测试人员用iTUnes 自己安装 要么苦逼的一个个在我Xcode上直接安装测试包,操作起来又麻烦又苦逼, ...

  10. 让linux开机默认开启小键盘

     linux默认开机不开启数字键盘numberlock,每次输入开机密码还得劳烦自己去点亮指示灯,让此灯开机自动点亮,需要一个软件才行,就是numlockx了,可以通过yum安装:yuminstall ...