veitchzheng 2015-03-18 03:23 采纳率: 0%
浏览 1230

mysql not in(一批数据) 数据量大 线上不适合建表

select * from tb_aabb where id not in (20001,20002,20185,20204,20285,20738,40002,40003,40004,40005,40006,40011,40013);

tb_aabb数据量百万级,同时id总量有1500,线上数据不适合建表联表,这种的有什么解决方案么?谢过了

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-03 12:50
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在MySQL中,你可以使用IN运算符来查询满足条件的数据。如果你的数据量非常大,并且在线上环境中不建议创建新表,那么你可以考虑以下几种方法:

    1. 使用子查询和LEFT JOIN

    对于你的需求,可以尝试使用一个子查询来过滤出你需要的数据。

    SELECT * FROM `tb_aabb`
    WHERE `id` NOT IN (
        SELECT `id` 
        FROM `tb_aabb`
        WHERE `id` = '20001' OR `id` = '20002' OR `id` = '20185' OR `id` = '20204' OR `id` = '20285' OR `id` = '20738' OR `id` = '40002' OR `id` = '40003' OR `id` = '40004' OR `id` = '40005' OR `id` = '40006' OR `id` = '40011' OR `id` = '40013'
    )
    

    注意:这个SQL语句可能会影响性能,因为它会检查所有行是否包含特定ID,而不是只检查那些ID不在给定列表中的行。

    2. 使用CASE WHEN语句

    另一个选择是通过CASE WHEN语句来筛选数据。

    SELECT *
    FROM `tb_aabb`
    WHERE `id` NOT IN (
        CASE WHEN `id` = '20001' THEN '20001'
            WHEN `id` = '20002' THEN '20002'
            WHEN `id` = '20185' THEN '20185'
            WHEN `id` = '20204' THEN '20204'
            WHEN `id` = '20285' THEN '20285'
            WHEN `id` = '20738' THEN '20738'
            WHEN `id` = '40002' THEN '40002'
            WHEN `id` = '40003' THEN '40003'
            WHEN `id` = '40004' THEN '40004'
            WHEN `id` = '40005' THEN '40005'
            WHEN `id` = '40006' THEN '40006'
            WHEN `id` = '40011' THEN '40011'
            WHEN `id` = '40013' THEN '40013'
        END AS 'Not In List'
    );
    

    3. 使用EXPLAIN分析优化

    如果上述方法仍然无法解决性能问题,你还可以尝试使用EXPLAIN命令来查看查询执行计划并进行调整。

    EXPLAIN ANALYZE SELECT * FROM `tb_aabb` WHERE `id` NOT IN (
        SELECT `id` 
        FROM `tb_aabb`
        WHERE `id` = '20001' OR `id` = '20002' OR `id` = '20185' OR `id` = '20204' OR `id` = '20285' OR `id` = '20738' OR `id` = '40002' OR `id` = '40003' OR `id` = '40004' OR `id` = '40005' OR `id` = '40006' OR `id` = '40011' OR `id` = '40013'
    ) ;
    

    这将显示查询的执行计划,帮助你理解查询为何如此慢,然后你可以根据实际情况进行优化。

    注意事项

    • 在实际应用中,这些策略应该与数据库管理员一起测试和实施。
    • 保持SQL语句简洁,避免不必要的嵌套查询。
    • 遵循索引原则,确保索引对数据访问至关重要。

    希望这些建议能帮助到你!

    评论

报告相同问题?