SELECT a.id,a.name,a.sn,a.code,a.kind,a.address,a.longitude,a.latitude, a.factory,a.category,a.model,a.created, a.aid,a.enable,a.sort,a.rid, a.last_data_time,a.status,a.meter_no,a.cust_no,a.comm_no,a.dev_type, b.name as areaName, b.code as areaCode, d.NAME as modelName, c.NAME AS appName, c.fetchFreq AS fetchFreq, c.offlineDelay AS offlineDelay, c.uploadFreq uploadFreq, c.offline_cycle offlineCycle, ‘device’ as type FROM hd_device a join hd_device_area b on b.id = a.category join hd_area_relation r on r.des = b.id left join hd_area_relation r1 on r.anc = r1.des join hd_iot_app c on c.id = a.aid JOIN hd_iot_model d ON c.mid = d.id left join hd_treenode_cate t on t.tid = a.id and t.target = ‘division’ left join hd_treenode n on n.id = t.nid left join hd_tag g on g.tid = a.id and g.target = ‘device’ WHERE 1=1 and ( c.mid = ‘db’ and r1.anc in ( ‘8Ur0Mq3YMHFU3wCis2Q6P#1’ ) ) group by a.id LIMIT 30
你的程序里面条件应该都是前台传过来的吧,而你通过客户端单独执行的条件都是你指定的,所以执行时间和执行计划不一样是合理的,你应该测试一下如果你前台传过来哪些条件能过滤出来最多的数据是不是量很大,而且LIMIT里后面是不是可以填非常大的数字,例如这样
SELECT
a.id,
a.name,
a.sn,
a.code,
a.kind,
a.address,
a.longitude,
a.latitude,
a.factory,
a.category,
a.model,
a.created,
a.aid,
a.enable,
a.sort,
a.rid,
a.last_data_time,
a.status,
a.meter_no,
a.cust_no,
a.comm_no,
a.dev_type,
b.name AS areaName,
b.code AS areaCode,
d.NAME AS modelName,
c.NAME AS appName,
c.fetchFreq AS fetchFreq,
c.offlineDelay AS offlineDelay,
c.uploadFreq uploadFreq,
c.offline_cycle offlineCycle,
‘device’ AS TYPE
FROM
hd_device a
JOIN hd_device_area b
ON b.id = a.category
JOIN hd_area_relation r
ON r.des = b.id
LEFT JOIN hd_area_relation r1
ON r.anc = r1.des
JOIN hd_iot_app c
ON c.id = a.aid
JOIN hd_iot_model d
ON c.mid = d.id
LEFT JOIN hd_treenode_cate t
ON t.tid = a.id
LEFT JOIN hd_treenode n
ON n.id = t.nid
LEFT JOIN hd_tag g
ON g.tid = a.id
WHERE 1 = 1
GROUP BY a.id LIMIT 10000000000
另外你如果在程序的连接串中配置了prepstmt的话,所有的sql走一样的执行计划,你要考虑下,当你选择条件最宽泛的时候,走这个执行计划还合不合适。