我在三个表中有~20GB的数据。我生成的报告基本上是50-60个SQL查询,它们根据过滤后的数据生成列表和统计信息。
在运行这些查询之前过滤数据的最佳方法是什么?
我的第一种方法是为每个数据表创建临时表,我在其中复制过滤后的记录,但是复制兆字节甚至千兆字节的数据需要花费大量时间。在60个查询中应用过滤器(即添加嵌套子查询,如
WHERE id IN (some complex filter logic))也似乎浪费资源。
我想将过滤和创建报告分开,服务是公开的,生成报告的时间不超过10秒,这是现在可以接受的。
有三个表(括号中的私钥和外键):
过滤器示例 - 行人死亡的事故:
INSERT accidents_temp SELECT * FROM accidents WHERE id IN ( SELECT accident_id FROM participants WHERE injury="death" AND vehicle_id IS NULL )
INSERT vehicles_temp SELECT * FROM vehicles WHERE accident_id IN ( SELECT id FROM accidents_temp )
INSERT participants_temp SELECT * FROM participants WHERE accident_id IN ( SELECT id FROM accidents_temp )
之后,我运行报告查询,使用所有三个临时表,包括JOIN,COUNT,SUM和所有内容; - )