MYSQL千万级别多表关联查询优化

今天发现去年写的sql竟然无法将数据查出来,每次竟然需要查询将近1小时,1小时后被系统自动kill掉,以下是优化过程,记录一下。

场景

  1. mysql
  2. 主要统计2张表,其中一张table_1,数据量1649万,另一张table_2,数据量1600多万
  3. 需要通过俩张表的数据,进行统计分析

优化前

优化前SQL

优化前SQL执行计划

通过EXPLAIN,查看执行计划如下:
《MYSQL千万级别多表关联查询优化》

分析

由执行计划可以看出,针对T表,一共进行了2次全表扫描,且Extra 为 Using temporary,由于查询数据量巨大,并没有使用索引
思考优化方向,减少扫描全表查询,使用索引查询。

优化后

优化后sql

执行计划

《MYSQL千万级别多表关联查询优化》

分析

由执行计划可以看出,扫描数据由1600万降低到800万,扫描T表用到了索引,由于数据量巨大,使用FORCE INDEX 强制使用索引,查询时间降低至20分钟,可以勉强查出数据。

总结

  1. 尽量避免使用关联查询,如果必须使用关联查询,也一定将数据量小的作为根表。
  2. 根据执行计划,尽量使用索引,如果数据量较大导致默认索引不使用,可以使用 FORCE INDEX 强制使用数据库索引。
  3. 多表关联查询,关联查询条件一定使用主键或者索引关联。

后记

本次优化只是解决了本次查询,随着数据量越来越大,优化有的SQL终究有一天还会挂掉,后续需要通过优化查询业务逻辑,使用临时表,将以前的数据做备份,减少查询时间段,优化整体查询效率。

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注