zoukankan      html  css  js  c++  java
  • MYSQL一次千万级连表查询优化

    MYSQL一次千万级连表查询优化

    一、总结

    一句话总结:

    原理是用子查询优化join连表查询(lavarel的模型操作喜欢这么干)(因为连表数据臃肿,再进行条件查询和分组就太吃亏了),这这里的效率提升了1000倍
    这里提升效率是先用子查询进行了条件查询,这样再连表花费就没有那么大了
    多表内联表后数据就变得臃肿了,这时候再进行条件查询和分组就太吃亏了,于是我们可以先对单表进行条件处理,再进行连表查询,只不过这个方案只是用了子查询而没有内联查询了,而两者效率对比之下,有内联的方案带其他查询条件的效率更高。

    1、查看sql语句的执行效率?

    mysql中查看sqp语句具体的执行效率就用explain

    2、连表操作如何优化?

    可以先用子查询 将条件数据筛选出来,然后再进行连表操作,这样会比先连表后找符合条件的数据效率要高很多倍

    二、MYSQL一次千万级连表查询优化(一)

    转自或参考:MYSQL一次千万级连表查询优化(一)
    https://blog.csdn.net/insis_mo/article/details/82897665

    概述:

    这个SQL查询关联两个数据表,一个是攻击IP用户表主要是记录IP的信息,如第一次攻击时间,地址,IP等等,一个是IP攻击次数表主要是记录每天IP攻击次数。而需求是获取某天攻击IP信息和次数。(以下SQL语句测试均在测试服务器上上,正式服务器的性能好,查询时间快不少。)

    准备:

    查看表的行数:
    这里写图片描述
    这里写图片描述
    未优化前SQL语句为:

    SELECT
        attack_ip,
        country,
        province,
        city,
        line,
        info_update_time AS attack_time,
        sum( attack_count ) AS attack_times 
    FROM
        `blacklist_attack_ip`
        INNER JOIN `blacklist_ip_count_date` ON `blacklist_attack_ip`.`attack_ip` = `blacklist_ip_count_date`.`ip` 
    WHERE
        `attack_count` > 0 
        AND `date` BETWEEN '2017-10-13 00:00:00' 
        AND '2017-10-13 23:59:59' 
    GROUP BY
        `ip`
        LIMIT 10 OFFSET 1000

    先EXPLAIN分析一下:
    这里写图片描述
    这里看到索引是有的,但是IP攻击次数表blacklist_ip_count_data也用上了临时表。那么这SQL不优化直接第一次执行需要多久(这里强调第一次是因为MYSQL带有缓存功能,执行过一次的同样SQL,第二次会快很多。)
    这里写图片描述
    实际查询时间为300+秒,这完全不能接受呀,这还是没有其他搜索条件下的。
    那么我们怎么优化呢,这里用的是内联表查询,大家都是知道子查询完全是可以代替内联表查询的,只不过SQL语句复杂了不少,那么我们分析一下这SQL,两个表分表提供了什么?
    1、IP攻击次数表blacklist_ip_count_data主要提供的指定时间条件查询,攻击次数条件查询后的IP和每个IP符合条件下的具体攻击次数。
    2、攻击IP用户表blacklist_attack_ip主要是具体IP的信息,如第一次攻击时间,地址,IP等等。
    那么我们一步步来:
    1、IP攻击次数表blacklist_ip_count_data获取符合时间条件和攻击次数的IP并且以IP分组:
    这里写图片描述
    2、攻击IP用户表blacklist_attack_ip指定具体的IP获取信息:
    这里写图片描述
    然后结合在一起:
    这里写图片描述
    可见,取出来的数据完全一模一样,可是优化后效率从原来的330秒变成了0.28秒,这里足足提升了1000多倍的速度。这也基本满足了我们的优化需求。
    我们EXPLAIN了解一下情况:
    这里写图片描述

    总结:

    其实这个优化方案跟我上一篇文章解决原理一样,都是解决了内联表后数据就变得臃肿了,这时候再进行条件查询和分组就太吃亏了,于是我们可以先对单表进行条件处理,再进行连表查询,只不过这个方案只是用了子查询而没有内联查询了,而两者效率对比之下,有内联的方案带其他查询条件的效率更高。

    --------------------- 本文来自 Tim_PHPer 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/Tim_phper/article/details/78357016?utm_source=copy

     
  • 相关阅读:
    如何解决跨域问题?
    eclipse 显示堆内存状态
    MATLAB解一元线性回归问题
    Java深入理解深拷贝和浅拷贝区别
    Spring中使用DataSourceTransactionManager进行事务管理的xml配置
    jsp:forward
    Mybatis入门笔记链接
    python 判断字符串是否全为字母或数字
    java对象的浅克隆和深克隆
    安装使用ipython notebook
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/11671029.html
Copyright © 2011-2022 走看看