|
发表于 2019-9-26 09:30:03
|
显示全部楼层
本帖最后由 江苏院-吴昊 于 2019-9-26 11:17 编辑
如果你没有修改过,平台默认的是用like语句,sExecutorFID字段。因为任务的执行者是可以指定部门和岗位的,所以用的是like。
平台用的是:
String item = ":" + var + " like concat(" + alias + ".sExecutorFID, '%')";
需要把表里所有行的sExecutorFID 取出来拼接 %,
即 当前人的 sFID like SA_Task.sExecutorFID + '%'
如果你确定你的任务都是指定到psm的,不是dpt也不是pos。那么可以把 like 直接改为 =。性能提升很明显。
9万数据:
平台原SQL:
- SELECT
- SA_Task.*
- FROM
- SA_Task SA_Task
- INNER JOIN SA_Task SA_Task_P ON SA_Task_P.sID = SA_Task.sParentID
- WHERE
- (
- (
- (
- (
- SA_Task_P.sKindID = 'tkTask'
- AND SA_Task.sKindID = 'tkExecutor'
- )
- OR SA_Task.sKindID = 'tkTask'
- )
- AND (
- (
- SA_Task.sStatusID = 'tesReady'
- OR SA_Task.sStatusID = 'tesExecuting'
- )
- )
- )
- AND '/JSPDI.ogn/gg.dpt/zkjs.pos/100448@zkjs.psm' like concat(SA_Task.sExecutorFID,'%')
- )
- ORDER BY
- sCreateTime DESC
- LIMIT 0,
- 10
复制代码
改为=
- SELECT
- SA_Task.*
- FROM
- SA_Task SA_Task
- INNER JOIN SA_Task SA_Task_P ON SA_Task_P.sID = SA_Task.sParentID
- WHERE
- (
- (
- (
- (
- SA_Task_P.sKindID = 'tkTask'
- AND SA_Task.sKindID = 'tkExecutor'
- )
- OR SA_Task.sKindID = 'tkTask'
- )
- AND (
- (
- SA_Task.sStatusID = 'tesReady'
- OR SA_Task.sStatusID = 'tesExecuting'
- )
- )
- )
- AND SA_Task.sExecutorFID = '/JSPDI.ogn/gg.dpt/zkjs.pos/100448@zkjs.psm'
- )
- ORDER BY
- sCreateTime DESC
- LIMIT 0,
- 10
复制代码
原SQL,1秒多
改进的SQL,0.01秒
----------------索引只能走一个,这条语句mysql选择的是IDX_TASK_CREATETIME 索引。所以我觉得还是like 的问题。----
如果要指定部门、岗位。
应该用把/JSPDI.ogn/gg.dpt/zkjs.pos/100448@zkjs.psm ,按层级分解,使用=做过滤条件,然后用or连接,应该效率也会高点
|
|