WHERE
fp.status
=
'95'
AND
fp.process_date
>=
pm.begin_date
AND
fp.process_date
<=
pm.END_DATE
AND
fp.item_code
LIKE
CONCAT(pm.itemCode,
'%'
)
) processMoney
经过一步一步拆分执行的sql,发现就是执行金额统计慢.
只用了三个字段分别是status、process_date、item_code 加索引吧(process_date、item_code)。
直接跑了下还是慢
来看下执行计划
一脸懵逼 索引只执行了日期process_date,没有科目item_code
在我得理解中科目关联我用了like abc% 应该走索引的
然后我试下,固定科目的时候索引出来了。
难道动态匹配的时候索引会消失,有知道的老铁可以给我留言
中途试了下locate、POSITION (有效的)
都没效果
如果是%jkjk 的可以用反转函数求解
没招了,最后发现in操作居然走索引,
(SELECT SUM(fp.PROCESS_CUR_MONEY)
FROM fbs_budget_process fp
WHERE fp.status = '95'
AND fp.process_date >= pm.begin_date
AND fp.process_date <= pm.END_DATE
AND fp.item_code LIKE CONCAT(pm.itemCode, '%')
修改后 试下了这下走索引了
(SELECT SUM(fp.PROCESS_CUR_MONEY)
FROM fbs_budget_process fp
WHERE
fp.item_code in (select fi.ITEM_CODE from fbs_item fi where fi.ITEM_CODE like CONCAT(pm.itemCode,'%') )
AND fp.status = '95'
AND fp.process_date BETWEEN pm.begin_date and pm.END_DATE)
回顾下最后
平时在网上看 like 匹配符在右边的时候是走索引的,但这个好像只能是固定的前缀
其实 like CONCAT(pm.itemCode,'%') 动态匹配的时候是不走索引的
like CONCAT('200','%') 固定了就走索引了
有单一的 like concat转为in 和 小表的like concat
fp.item_code in (select fi.ITEM_CODE from fbs_item fi where fi.ITEM_CODE like CONCAT(pm.itemCode,'%') )
处理用了科目表(fbs_item)数据量小,
在匹配出子科目的时候执行速度快点,
然后主表in走索引
复制代码