如何在一系列查询之前过滤记录?

时间:2018-01-28 16:01:24

标签: mysql sql database

我在三个表中有~20GB的数据。我生成的报告基本上是50-60个SQL查询,它们根据过滤后的数据生成列表和统计信息。

在运行这些查询之前过滤数据的最佳方法是什么?

我的第一种方法是为每个数据表创建临时表,我在其中复制过滤后的记录,但是复制兆字节甚至千兆字节的数据需要花费大量时间。在60个查询中应用过滤器(即添加嵌套子查询,如

WHERE id IN (some complex filter logic)
)也似乎浪费资源。

我想将过滤和创建报告分开,服务是公开的,生成报告的时间不超过10秒,这是现在可以接受的。

数据库和过滤详细信息

有三个表(括号中的私钥和外键):

  • 意外[id]
  • 辆[id,accident_id]
  • 参与者[id,accident_id,vehicle_id(如果是行人,则为null)]

过滤器示例 - 行人死亡的事故:

  • 复制行人死亡的意外
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和所有内容; - )

0 个答案:

没有答案