关于把long类型的参数直接传到xml中当sql查询的参数非常慢这件事

发布时间 2023-12-18 20:10:38作者: nitianxiaozi

起初,有一张表超级大想要将表复制下来 如果查出来list再去复制这将非常慢,听了同事的建议使用了insert into (select * from table)速度得到了显著改善。可是我写代码的时候,再调用接口的时候发现足足有15s,而navicat执行sql语句只有400ms,感觉哪里出了问题但还不知道,最终经过同事的明察秋毫发现我的传参出了问题。

sql如下:

INSERT INTO quality_evaluate_autoform (
            SELECT
                UUID_SHORT(),
                form_name,
                form_code,
                NULL,
                CASE
                    WHEN fill_state != '未填写' THEN
                        '已填写'
                    when fill_state = '未填写' then
                    '未填写'
                    END AS fill_state,
                signature_number,
                0,
                NULL,
                NULL,
                file_token,
                NULL,
                default_form_data,
                form_data,
                html_original_body,
                html_body,
                NULL,
                #{id},
                NULL,
                ref_autoform_htmldata_id,
                ref_autoform_id,
                ref_directory_tree_node_id,
                NULL,
                NULL,
                NULL,
                NULL,
                NULL,
                now(),
                NULL,
                now(),
                0,
                NULL,
                NULL,
                NULL
            FROM
                quality_evaluate_autoform
            WHERE
                ref_wbs_node_id = #{wbsNodeId}
              AND delete_flag = 0)

  

就是因为#{wbsNodeId} 这个参数我在代码传参时候不小心用了long类型而导致的!我的天!400ms的事情因为一个类型转换变成了15s,而且还因为转换类型使得ref_wbs_Node_id上的索引失效!所以一定要仔细看好每一步的传参!

1. 用or索引失效——解决用in 代替or

2. 字段使用函数导致索引失效

3. 隐式类型转换会使索引失效!(我就是犯了这个)

4. like +”%param%“ 索引失效

5. 如果查询索引辨识度低,索引可能也不会用

6. NULL值:如果索引列包含NULL值,并且查询条件中没有明确处理NULL值的情况,可能会导致索引失效