美文网首页程序员
mysql查询优化技巧

mysql查询优化技巧

作者: 48892085f47c | 来源:发表于2017-03-06 21:44 被阅读0次

工作中,经常有运营需求用于统计线上数据,实际场景中两个百万级表联合查询,往往会大大消耗查询时间。
针对此问题,解决思路可以将sql,拆分,可利用中间表方式,对数据进行统计。

例如:订单表 t_order,订单收货表t_order_shipping,会员表 t_member;
数据需求:获取会员表中大于二十岁的手机号,排除2017年已支付订单的手机号。

根据此需求,我们可以写出如下sql:

select distinct m.mobile_phone
from t_member m
where m.age >20
and m.mobile_phone not in (
   select distinct s.mobile_phone
   from t_order o, t_order_shipping
   where o.order_id = s.order_id
   and 0.status ='已支付';
);

当t_member 千万级别,t_order和t_order_shipping百万级别数据量时,以上查询将需要非常多时间,大量的时间都用在了复制临时表和发送查询结果上。
经测试,mobile_phone加索引的请求下,该sql大概执行半小时。

优化方案:
1、可使用关联查询代替子查询,避免临时表复制

select distinct m.mobile_phone
from t_member m
left join (
   select distinct s.mobile_phone
   from t_order o, t_order_shipping
   where o.order_id = s.order_id
   and 0.status ='已支付'
) t
on m.mobile_phone = t.mobile_phone
where t.mobile_phone is null;

2、拆分sql,增加中间表;
统计需求,需要对两组数据数进行去重过滤,我们可以分别单独写sql,将两个数据将入中间表tmp_membertmp_order中:

CREATE TABLE tmp_member SELECT
    mobile_phone
FROM
    t_member
WHERE
    age >20;
CREATE TABLE tmp_order 
select distinct s.mobile_phone
   from t_order o, t_order_shipping
   where o.order_id = s.order_id
   and 0.status ='已支付'

给临时表tmp_membertmp_ordermobile_phone字段添加索引;

ALTER TABLE tmp_member ADD INDEX idx_mobile_phone (mobile_phone);

ALTER TABLE tmp_order ADD INDEX idx_mobile_phone (mobile_phone);

tmp_member表中排除和tmp_order相同的电话号码,剩下的就是需要统计的电话号码;

DELETE tmp_member  FROM tmp_member , tmp_order WHERE tmp_member .mobile_phone= tmp_order .mobile_phone;

此方案,将大的查询结果,拆分成多个sql执行,大大提升执行时间;
亲测,此sql执行不超过一分钟。

相关文章

  • MySQL索引知多少

    mysql索引 总结关于mysql的索引,查询优化,SQL技巧等 1 索引类型 B-Tree索引 Hash索引 ...

  • MySQL性能调优

    MYSQL查询语句优化 mysql的性能优化包罗甚广: 索引优化,查询优化,查询缓存,服务器设置优化,操作系统和硬...

  • mysql查询优化技巧

    工作中,经常有运营需求用于统计线上数据,实际场景中两个百万级表联合查询,往往会大大消耗查询时间。针对此问题,解决思...

  • 10分钟掌握数据类型、索引、查询的MySQL优化技巧

    10分钟掌握数据类型、索引、查询的MySQL优化技巧? 不存在的! 本文的内容是总结一些MySQL的常见使用技巧,...

  • MySQL

    MySQL查询优化之道

  • MySQL 查询优化(九):分页查询优化技巧

    在有分页查询的应用中,包括 LIMIT 和 OFFSET 的查询十分常见,而且几乎每个都会有一个 ORDER BY...

  • MySQL 查询优化(九):分页查询优化技巧

    在有分页查询的应用中,包括 LIMIT 和 OFFSET 的查询十分常见,而且几乎每个都会有一个 ORDER BY...

  • mysql优化

    MYSQL优化 为查询缓存优化你的查询 EXPLAIN你的SELECT查询。根据结果给出分析相应的查询优化 当只要...

  • 9月17-MySQL性能优化

    MySQL性能优化策略 1、MySQL内核架构 2、索引原理与查询优化 加速MySQL高效查询数据的数据结构 二分...

  • Mysql查询语句优化技巧

    PS:根据自己平时写代码实际测试得出的一些小技巧,不敢保证对所有语句都有效,自己觉得还不错,哈哈哈,后续发现其他的...

网友评论

    本文标题:mysql查询优化技巧

    本文链接:https://www.haomeiwen.com/subject/noougttx.html