• 业务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走主键,速度很快

  • 相关阅读:
    第十八篇:在SOUI中实现PreTranslateMessage
    第十七篇:使用窗口的cache属性加速SOUI的渲染
    通过驱动向打印机发送一段(ESC)控制指令
    转一个希尔排序
    关于Memo或者Edit之类控件, 直接设置Text无法撤销的解决方案
    关于创建无窗体程序的一点心得
    在Vista或更高版本Windows系统中, 获取超大图标的办法
    随笔里的标签为啥不能用空格分隔??
    一个ICMP单元
    Delphi XE5 与其他版本共存
  • 原文地址:https://www.cnblogs.com/gczheng/p/9323410.html
Copyright © 2020-2023  润新知