多表连接查询,关联用户,设备,设备运行数据等多个表(此表查询时有用到in关键字,用来区分设备状态),
直接通过设备ID分组查询出该用户各个设备的最大运行时间,
当数据量越来越大的时候,查询速度就会越来越慢
(因为有用max,in等函数和关键字,部分索引不起作用,SQL语句已最优,单表最大数据条数1500万,还会越来越高)
然后没办法,就改用后台先查询出该用户的所有设备ID,再通过设备ID循环查询单个设备最大运行时间,
通过for循环对查询结果进行整合(改成这样后在单个用户访问时查询很快,多用户同时访问未测试)
这样的改为后台来循环查询访问数据库,在高并发的情况下是否可行?可有其他更好的解决方案?
后面是SQL语句:
SELECT
sa.id AS 'area.id',
sa.name AS 'area.name',
MAX(a.monitor_value) AS 'monitor_value'
FROM doss_card b //设备表
JOIN sys_user u ON u.id = b.create_by //用户表
JOIN sys_office o ON o.id = u.company_id //企业信息表
LEFT JOIN p_parse_result a ON a.dev_id = b.id //设备运行数据表(千万级以上,会越来越大)
LEFT JOIN sys_area sa ON sa.id = b.area_id //区域表
WHERE a.monitor_code IN ('S01-1TD','S01-2TD') //设备运行状态
AND b.del_flag = '0' AND b.auditing='1'
AND DATE_FORMAT(a.data_time,'%Y-%m-%d') = DATE_FORMAT(NOW(),'%Y-%m-%d')
AND (o.id = '8715f3f2cb274c80896f628f56b3f4a9' OR o.parent_ids LIKE '0,8715f3f2cb274c80896f628f56b3f4a9,%'
OR u.id = '47dd4dfa1a524e9e937e805841b7a440')
GROUP BY b.id //设备id分组
)a GROUP BY said //区域id分组
设备运行数据表实时数据跟设备台数成正比,一台设备的数据几天就可能达到千万级,此表还包含各种设备的数据,比如:运行时间,停机时间,是否运行,电压是否报警等,比较乱,不同的数据都是通过某个字段去关联查询特定的monitor_value值,就很慢,这样的情况可以建立不同的实时数据表跟触发器去实时处理吗?
追答个人感觉应该可以的,算了下每秒才几十的数据,你可以先做个测试看看,或者更简单点把这个实时表用Nosql数据库来保存,比如象Redis之类的都行,然后定时从redis回写到你们数据库里。