业务SQL优化
1,个人开户报表统计
优化前语句,执行时间80多秒
SELECT
a.DA AS f_da,
a.account_name AS f_account_name,
a.sex AS f_sex,
a.nick_name AS f_nickname,
a.create_time AS f_open_account_time,
DATE_FORMAT(a.create_time, '%Y%m%d') AS f_open_account_date,
HOUR (a.create_time) AS f_open_account_hour,
a.group_ids AS f_group_id,
a.f_reg_source AS f_reg_source,
t.f_user_area_id AS f_user_area_id,
t.f_user_type AS f_user_type,
t.f_source AS f_user_source,
device.device_id AS f_device_id,
CONCAT_WS(
",",
device.f_cai_id,
device.f_mobile_id,
device.f_pid_id,
device.f_stb_id
) AS f_device_series_id,
t.f_customer_code AS f_customer_code,
token.f_first_login_time AS f_first_login_time,
DATE_FORMAT(
token.f_first_login_time,
'%Y%m%d'
) AS f_first_login_date,
HOUR (token.f_first_login_time) AS f_first_longin_hour,
token.f_app_version AS f_app_version
FROM
(
(
(
account_info a
LEFT JOIN t_da_boss_info t ON a.DA = t.f_da
)
LEFT JOIN (
SELECT
d.home_id,
GROUP_CONCAT(d.device_id) AS device_id,
GROUP_CONCAT(d.cai_id) AS f_cai_id,
GROUP_CONCAT(d.mobile_id) AS f_mobile_id,
GROUP_CONCAT(d.pad_id) AS f_pid_id,
GROUP_CONCAT(d.stb_id) AS f_stb_id
FROM
device_info d
GROUP BY
d.home_id
) device ON a.home_id = device.home_id
)
LEFT JOIN (
SELECT
b.DA,
b.f_extend,
b.f_extend AS f_app_version,
MIN(b.f_create_time) AS f_first_login_time
FROM
account_token b
GROUP BY
b.DA
) token ON a.DA = token.DA
)
WHERE
a.create_time > '20000101'
AND a.create_time < '20000102'
优化后语句,执行2S
EXPLAIN
SELECT SQL_NO_CACHE
a.DA AS f_da,
a.account_name AS f_account_name,
a.sex AS f_sex,
a.nick_name AS f_nickname,
a.create_time AS f_open_account_time,
a.home_id AS f_home_id,
DATE_FORMAT(a.create_time, '%Y%m%d') AS f_open_account_date,
HOUR (a.create_time) AS f_open_account_hour,
a.group_ids AS f_group_id,
a.f_reg_source AS f_reg_source,
t.f_user_area_id AS f_user_area_id,
t.f_user_type AS f_user_type,
t.f_customer_code AS f_customer_code,
d.device_id AS f_device_id,
CONCAT_WS(
",",
d.f_cai_id,
d.f_mobile_id,
d.f_pid_id,
d.f_stb_id
) AS f_device_series_id,
min(b.f_first_login_time) as min_f_first_login_time,
DATE_FORMAT(
b.f_first_login_time,
'%Y%m%d'
) AS f_first_login_date,
HOUR (b.f_first_login_time) AS f_first_longin_hour,
b.f_app_version AS f_app_version
FROM
((account_info a
LEFT JOIN t_da_boss_info t ON a.DA = t.f_da)
LEFT JOIN (
SELECT
home_id,
GROUP_CONCAT(device_id) AS device_id,
GROUP_CONCAT(cai_id) AS f_cai_id,
GROUP_CONCAT(mobile_id) AS f_mobile_id,
GROUP_CONCAT(pad_id) AS f_pid_id,
GROUP_CONCAT(stb_id) AS f_stb_id
FROM
device_info
GROUP BY
home_id
)
d ON a.home_id = d.home_id)
LEFT JOIN (
SELECT
DA,
f_extend,
f_extend AS f_app_version,
f_create_time AS f_first_login_time
FROM
account_token
) b ON a.DA = b.DA
WHERE
a.create_time BETWEEN '2000-01-01 00:00:00'
AND '2000-01-02 00:00:00' GROUP BY a.da;
account_token表改为走主键DA,DA字段有主键,join走主键,速度很快
业务SQL优化的更多相关文章
- 4W条人才表循环处理业务sql优化过程
场景: 使用windows服务定时更新合同数据:执行存储过程(pas_RefreshContractStatus),但存储过程里面有一个需要更新4W条人才表循环处理业务 问题: 循环更新4W条人才表状 ...
- 性能优化之永恒之道(实时sql优化vs业务字段冗余vs离线计算)
在项目中,随着时间的推移,数据量越来越大,程序的某些功能性能也可能会随之下降,那么此时我们不得不需要对之前的功能进行性能优化.如果优化方案不得当,或者说不优雅,那可能将对整个系统产生不可逆的严重影响. ...
- SQL优化案例—— RowNumber分页
将业务语句翻译成SQL语句不仅是一门技术,还是一门艺术. 下面拿我们程序开发工程师最常用的ROW_NUMBER()分页作为一个典型案例来说明. 先来看看我们最常见的分页的样子: WITH CTE AS ...
- sql 优化
1.选择最有效率的表名顺序(只在基于规则的优化器中有效): oracle的解析器按照从右到左的顺序处理 from 子句中的表名,from子句中写在最后的表(基础表driving table)将被最先处 ...
- (转)SQL 优化原则
一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用 系统提交实际应用后,随着数据库中数据的增加,系 ...
- SQL优化技巧
我们开发的大部分软件,其基本业务流程都是:采集数据→将数据存储到数据库中→根据业务需求查询相应数据→对数据进行处理→传给前台展示.对整个流程进行分析,可以发现软件大部分的操作时间消耗都花在了数据库相关 ...
- 提高SQL查询效率(SQL优化)
要提高SQL查询效率where语句条件的先后次序应如何写 http://blog.csdn.net/sforiz/article/details/5345359 我们要做到不但会写SQL,还要做到 ...
- 基于Oracle的SQL优化(社区万众期待 数据库优化扛鼎巨著)
基于Oracle的SQL优化(社区万众期待数据库优化扛鼎巨著) 崔华 编 ISBN 978-7-121-21758-6 2014年1月出版 定价:128.00元 856页 16开 编辑推荐 本土O ...
- Oracle SQL 优化原则(实用篇)
由于SQL优化优化起来比较复杂,并且还受环境限制,在开发过程中,写SQL必须遵循以下几点原则: 1.Oracle 采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他Where ...
随机推荐
- Linux:history命令详解
Linux下History命令 主要用于显示历史指令记录内容, 下达历史纪录中的指令 . 语法 history [n] history [-c] history [-raw] histfiles ...
- CMD命令提示符下选中文字即可以复制和SecureCRT一样
用过 SecureCRT 的都会觉得复制粘贴很方便.只要选中相应文字,会自动复制.然后点鼠标右键就可以粘贴,非常方便. 但是在windows系统下的CMD里面,每次都要点鼠标右键→标记,再选中相应文字 ...
- final方法,abstract方法和abstract类,native方法
final方法 1.为了确保某个函数的行为在继承过程中保持不变,并且不能被覆盖(override),可以使用final方法. 2.为了效率上的考虑,将方法声明为final,让编译器对此方法的调用进行优 ...
- 个人Blog小程序开发完毕
今天忙了一天,算是把这个小程序弄好了,包括小程序前端页面.接口对接.后台系统.服务器架 设.域名备案.证书安装(现在阿里云的免费证书怎么审核要这么久啊,到现在还在审核中) 先上截图: 这个背景图片的替 ...
- python + sklearn ︱分类效果评估——acc、recall、F1、ROC、回归、距离
之前提到过聚类之后,聚类质量的评价: 聚类︱python实现 六大 分群质量评估指标(兰德系数.互信息.轮廓系数) R语言相关分类效果评估: R语言︱分类器的性能表现评价(混淆矩阵,准确率,召回率,F ...
- 从零开始编写深度学习库(五)PoolingLayer 网络层CPU编写
记录:编写卷积层和池化层,比较需要注意的细节就是边界问题,还有另外一个就是重叠池化的情况,这两个小细节比较重要,边界问题pad在反向求导的时候,由于tensorflow是没有计算的,另外一个比较烦人的 ...
- [Linux] sed命令使用之在文件中快速删除/增加指定行
1.删除文档的第一行 sed -i '1d' <file> 2.删除文档的最后一行sed -i '$d' <file> 3.在文档指定行中增加一行例如文档如下:echo &qu ...
- vuex(二)getters
getters: 有时候,我们需要对state的数据进行筛选,过滤.这些操作都是在组件的计算属性进行的.如果多个组件需要用到筛选后的数据,那我们就必须到处重复写该计算属性函数:或者将其提取到一个公共的 ...
- C++中atof函数的实现和atoi的实现
在C++中有两个系统函数可以实现字符串转浮点型和字符串转整形,下面实现一下这两个函数. #include <iostream> #include <string> using ...
- 20179223《Linux内核原理与分析》第七周学习笔记
视频知识学习 1.fork()函数被调用一次,但返回两次: 2.Linux通过复制父进程来创建一个子进程,通过调用fork来实现: 3.Linux会为每个子进程动态的分配一个task_struct结构 ...