mysql多表连接查询很慢,有更好的解决方案吗?

多表连接查询,关联用户,设备,设备运行数据等多个表(此表查询时有用到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分组

设备运行数据表才千万级,说明实时数据量应该不会太大,为什么不再建立一个实时数据表(当然如果有需要,这个表你也可以按区域之类的分表),表中就三字段,比如就设备ID,区域ID(这以两个为唯一索引)和当前最大monitor_value,然后在设备运行数据表中建立触发器,当插入新数据时就去更新那个实时数据表(或者说如果设备ID区域ID没出现就新建,如果有并且数据比那个还大就更新)追问

设备运行数据表实时数据跟设备台数成正比,一台设备的数据几天就可能达到千万级,此表还包含各种设备的数据,比如:运行时间,停机时间,是否运行,电压是否报警等,比较乱,不同的数据都是通过某个字段去关联查询特定的monitor_value值,就很慢,这样的情况可以建立不同的实时数据表跟触发器去实时处理吗?

追答

个人感觉应该可以的,算了下每秒才几十的数据,你可以先做个测试看看,或者更简单点把这个实时表用Nosql数据库来保存,比如象Redis之类的都行,然后定时从redis回写到你们数据库里。

温馨提示:答案为网友推荐,仅供参考
相似回答