SQL语句 parpering耗时很长 如何优化

SQL如下:
SELECT
*
FROM
(
(
SELECT
reg.FV_CUSTOMER_NAME username,
ass.FV_ASSESS_STATUS assStutas,
ass.FV_PRO_TYPE protype,
ass.FV_PRO_ADDR proaddr,
ass.FV_REG_CODE regcode,
ass.FD_CREATE_TIME createTime,
ass.FV_PRO_CODE proCode,
ass.FV_CITY_CODE cityCode,
ass.FN_PRO_AREA proArea,
ass.FN_FINAL_TOTAL finalTotal,
reg.FV_CUSTOMER_AREA cusarea
FROM
pgyw_assess ass,
brw_register reg
WHERE
ass.FV_OPE_MANAGER = reg.FN_REGIST_ID
AND reg.FN_REGIST_ID IN (
SELECT
FN_REGIST_ID
FROM
brw_register
WHERE
FN_COMPANY_ID IN (
SELECT
FN_CUSORG_ID
FROM
brw_cusorg
WHERE
FV_SEQS LIKE '%.298%'
)
)
)
UNION
(
SELECT
reg.FV_CUSTOMER_NAME username,
'3' AS assStutas,
ass.FV_PRO_TYPE protype,
ass.FV_PRO_ADDR proaddr,
ass.FV_REG_CODE regcode,
p.FD_CREATE_TIME createTime,
ass.FV_PRO_CODE proCode,
ass.FV_CITY_CODE cityCode,
ass.FN_PRO_AREA proArea,
ass.FN_FINAL_TOTAL finalTotal,
reg.FV_CUSTOMER_AREA cusarea
FROM
brw_ass_parper p,
brw_register reg,
pgyw_assess ass
WHERE
p.FN_REGIST_ID = reg.FN_REGIST_ID
AND ass.FN_ASSESS_ID = p.FN_ASSESS_ID
AND reg.FN_REGIST_ID IN (
SELECT
FN_REGIST_ID
FROM
brw_register
WHERE
FN_COMPANY_ID IN (
SELECT
FN_CUSORG_ID
FROM
brw_cusorg
WHERE
FV_SEQS LIKE '%.298%'
)
)
)
ORDER BY
createTime DESC
) a
WHERE
1 = 1
AND createTime BETWEEN '2019-01-01 00:00:00'
AND '2020-03-26 08:33:20'
AND createTime BETWEEN '1900-01-01 00:00:00'
AND '2019-02-01 23:59:59'
LIMIT 0,
15

explain如下:
图片说明

图片说明

根据您提供的信息,我可以看出您的SQL语句涉及多个表的查询,并使用了UNION操作符,可能会导致很长的执行时间。以下是我建议您可以尝试的SQL优化方式:

  1. 确认表上的索引: 确保表上存在必要的索引,以加快查询。在列或列组上创建多列索引可以使查询更快。例如,在p.FN_REGIST_ID,reg.FN_REGIST_ID AND ass.FN_ASSESS_ID列上创建联合索引。

  2. 优化子查询: 子查询可以是查询优化的问题,您可以尝试从最外层查询中删除子查询,并将子查询分解为单独的查询。

  3. 使用JOIN语句: UNION操作符往往会导致性能损失。当可能使用JOIN语句时,请使用它。

  4. 减少所选列: 您可以删除不必要的列,减少所选列,从而减少计算时间。

  5. 分页: 最后15条查询的限制条件可以通过分页来实现,分页不会减少总时间,但可以按页返回结果集。

您可以根据表达式分步优化您的查询,首先建议您检查表上的索引,并保证查询性能最佳。