在工作中,除了开发,有时还需要做一些数据统计。
统计数据时,sql执行超时。
可以通过以下手段处理。
一、优化sql
首先,通过 EXPLAIN 查看执行计划,看有没有走索引,能加索引的加索引,没有走索引的尽量优化。
常见的sql优化见: https://blog.csdn.net/sinat_32502451/article/details/136075255
二、临时调大超时时间
如果默认的超时时间是1分钟,可以先临时调大,待sql 执行完毕,再调整回去。
SET SESSION max_execution_time = 120000; -- 单位是毫秒 (ms),这里设为 120 秒
或者是:
-- 通过 /*+ MAX_EXECUTION_TIME(120000) */ 调整这次查询的超时时间。
SELECT /*+ MAX_EXECUTION_TIME(60000) */ user_id FROM t_users ;
三、建临时表
如果一个 sql 很复杂,那么就要尽量拆分,可以通过临时表来协助。
比如:
SELECT
u.user_id,
t.event_name
FROM t_users u
LEFT JOIN (
SELECT DISTINCT user_id, event_name
FROM t_activities
WHERE date BETWEEN '2020-07-31' AND '2020-08-31'
) t ON u.user_id = t.user_id;
这个sql, 可以先将 LEFT JOIN 里面(也可以是子查询) 的数据先放进临时表。
注意:如果某些sql不允许使用 CREATE TEMPORARY TABLE 这种语法,也可以用 CREATE TABLE。
-- 第一步:创建并填充临时表(只存去重后的 ID)
CREATE TEMPORARY TABLE tmp_active_users AS
SELECT DISTINCT user_id
FROM t_activities
WHERE date BETWEEN '2020-07-31' AND '2020-08-31';
-- 第二步:直接关联查询
SELECT u.user_id
FROM t_users u
JOIN tmp_active_users t ON u.user_id = t.user_id;
这种用临时表处理后,数据量会极大地下降,sql 执行时间会降低。
四、CSV 导出导入
如果连建临时表都超时了,那也可以先 SELECT , 然后用 CSV 导出再导入。
导出导入格式,最好用 CSV, 非常轻量。
详情见:
https://blog.csdn.net/sinat_32502451/article/details/159658198
五、写代码统计
某些太复杂的 sql,可以先分批查出表数据,导出到 excel,最后再通过写代码,读取excel数据,进行统计。