对MySQL子查询的简单改写优化
许多在Oracle等其他关系数据库上经验丰富的DBA或开发人员,可能习惯了数据库在子查询上的优化表现,期望将其经验直接应用于MySQL数据库。遗憾的是,MySQL在处理子查询时可能会有不同的表现,甚至可能让人失望。在我们的生产环境中,就遇到了这样的问题。
让我们先来看一个具体的例子:
```sql
select i_id, sum(i_sell) as i_sell
from table_data
where i_id in (select i_id from table_data where Gmt_create >= '2011-10-07 00:00:00')
group by i_id;
```
这条SQL的逻辑可以理解为:首先查询出2011年10月7日之后卖出的所有书籍,然后对这些书籍的销量进行汇总。看似简单的查询,但在大数据量下可能会遇到性能问题。
MySQL在处理子查询时,其优化器的方式与我们的预期可能有所不同。理想情况下,我们希望子查询先得出结果,然后用这个结果去驱动外查询。但在MySQL中,优化器可能会先进行外查询的扫描,然后将每一条数据与子查询进行关联。如果外表的数据量非常大,那么这种处理方式将会导致大量的数据关联,性能大幅下降。
在我们的例子中,table_data表有70万条数据,子查询返回的结果中有很多重复数据。这意味着我们需要进行近70万次关联操作,导致这条SQL执行非常缓慢。
那么,如何解决这个问题呢?我们可以尝试将子查询改为关联查询:
```sql
SELECT t2.i_id, SUM(t2.i_sell) AS sold
FROM (SELECT distinct i_id FROM table_data WHERE gmt_create >= '2011-10-07 00:00:00') t1, table_data t2
WHERE t1.i_id = t2.i_id GROUP BY t2.i_id;
```
网站源码
- 2018新款VAIO S13内部做工如何?全新VAIO S13拆解图评
- 十张图看清奇酷手机 大神手机和大神Note3
- CSS常用样式简单的总结包括定位、显示等属性
- 控制光线反差的三种方式图文教程
- 华硕灵耀X2Pro值得买吗 华硕灵耀X2Pro笔记本深度图
- ThinkPad T470p值得买吗?ThinkPad T470p商务本全面详细
- 神秘的影子帐号揭秘
- html5跳转小程序wx-open-launch-weapp踩坑
- DW怎么设置滚动字幕-
- 全国各地敲响网络安全警钟 河南企业如何应对?
- 动动歪脑筋 n个妙招让笔记本使用更轻松
- 了解无线加密的多种方法及其区别
- ai怎么画学霸人物插画- ai人物角色画法
- div宽度设置width-100%后再设置padding或margin超出父元
- Acer掠夺者Triton700值得买吗?宏碁掠夺者Triton700
- 国际最高IP68防水认证 雷柏V750防水游戏机械键盘