• ADADADADAD

    把not in 改成not exists后的优化[ mysql数据库 ]

    mysql数据库 时间:2024-12-03 12:12:35

    作者:文/会员上传

    简介:

    把not in 改成not exists后的优化
    近期,OA数据库里面存在一条慢SQL,其执行时间为3分16秒。这条慢SQL语句每个月可能会运行几次,但其运行后,总会导致数据库CPU利用率飙升。然后

    以下为本文的正文内容,内容仅供参考!本站为公益性网站,复制本文以及下载DOC文档全部免费。

    把not in 改成not exists后的优化
    近期,OA数据库里面存在一条慢SQL,其执行时间为3分16秒。这条慢SQL语句每个月可能会运行几次,但其运行后,总会导致数据库CPU利用率飙升。然后我就对这个慢SQL语句进行了改写测试,改写后的运行时间降为13s(虽然还是很慢,但已经速度提升了18倍)。



    具体分析过程如下: 通过慢日志捕捉到的慢SQL及其运行时间: 1selectid,start_member_id,start_date,modify_member_id,modify_datefromformmain_0141whereidnotin(selectcontent_data_idfromctp_content_allwherecontent_template_id='6890363387462501722'andcontent_data_idisnotnull)limit20000,10000\G Emptyset(3min2.01sec)

    可见,生产中,该语句运行时间是3分2秒。
    我们来看看其执行计划,为什么这么慢:




    2、我改写后的索引,用的是notexists ,内外交互式子查询:
    mysql>selectid,start_member_id,start_date,modify_member_id,modify_datefromformmain_0141wherenotexists(select1fromctp_content_allwherecontent_data_id=formmain_0141.idandcontent_data_idisnotnullandcontent_template_id='6890363387462501722')limit20000,10000;
    Emptyset(13.84sec)
    看到用not exists后,执行时间降到13秒,效率有显著提升。
    我们再看一下优化后语句的执行计划:



    把not in改写为not exists快的原因,我想用mysql 5.6的新特性ICP的原理来解释,在改写后的sql语句中,MySQL在从ctp_content_all表中取出数据的同时,就开始判断是否可以在formmain_0141表中进行id过滤,从而大大减少了上层对SQL层的记录索引,提高数据库整体性能。 反观优化前的那条sql语句,它是把ctp_content_all 表里面所有符合条件的记录都取出来后,再到formmain_0141表里进行id字段过滤,所以慢。
    把not in 改成not exists后的优化.docx

    将本文的Word文档下载到电脑

    推荐度:

    下载
    热门标签: existsinnot