添加INDEX以加快查询的最佳解决方案是什么?

时间:2020-02-06 17:00:27

标签: mysql sql performance

现在我有一个在Mysql数据库上运行50分钟的查询,我不能接受...

我希望此过程可以在15分钟内运行。...

insert into appianData.IC_DeletedRecords 
            (sourcetableid, 
             concatkey, 
             sourcetablecode) 
select mstid, 
        concatkey, 
        'icmstlocationheader' as sourcetablecode 
 from   appianData.IC_MST_LocationHeader
 where  concatkey not in(select concatkey 
                         from appianData.IC_PURGE_LocationHeader)

“ sourcetableid”和“ mstid”是唯一的。

那么添加索引或对此进行优化的最佳方法是什么?

谢谢

2 个答案:

答案 0 :(得分:1)

我将select写为:

select mstid, concatkey,  'icmstlocationheader' as sourcetablecode 
from  appianData.IC_MST_LocationHeader lh
where not exists (select 1 
                  from appianData.IC_PURGE_LocationHeader lhp
                  where lhp.concatkey = lh.concatkey
                 );

然后您要在IC_PURGE_LocationHeader(concatkey)上建立索引。

答案 1 :(得分:0)

由于它是INSERT INTO appianData.IC_DeletedRecords (sourcetableid, concatkey, sourcetablecode) SELECT m.mstid, m.concatkey, 'icmstlocationheader' as sourcetablecode FROM appianData.IC_MST_LocationHeader AS m LEFT JOIN appianData.IC_PURGE_LocationHeader AS p ON m.concatkey = p.concatkey WHERE p.concatkey IS NULL ; 条件,因此您应该能够使用“ LEFT JOIN ... WHERE rightTable无匹配项”,而不必担心会增加结果的多个匹配项。

concatkey

使用此版本查询或您在问题中提出的版本查询,两个源表中的DrvClassA *drv_a_obj; DrvClassB *drv_b_obj; DrvClassC *drv_c_obj; if ( use_drv_a ) { drv_a_obj = new DrvClassA(args); } if ( use_drv_b ) { drv_b_obj = new DrvClassB(args); } if ( use_drv_c ) { drv_c_obj = new DrvClassC(args); } 上的索引应有很大帮助。