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

 
原文地址:https://www.cnblogs.com/Renyi-Fan/p/11671029.html