• MySQL子查询优化实例


    优化:子查询改写成关联查询

    线上遇到问题,查询较慢,如为对应SQL的查询执行计划:

    localhost.user>explain EXTENDED select  uid from bar_user_6 where bid='9279' and uid in (SELECT a_uid FROM `user_atten_3` WHERE uid='1400696003') limit 12G
    *************************** 1. row ***************************
               id: 1
      select_type: PRIMARY
            table: bar_user_6
             type: ref
    possible_keys: bid
              key: bid
          key_len: 4
              ref: const
             rows: 581295
         filtered: 100.00
            Extra: Using where; Using index
    *************************** 2. row ***************************
               id: 2
      select_type: DEPENDENT SUBQUERY
            table: user_atten_3
             type: eq_ref
    possible_keys: uid
              key: uid
          key_len: 30
              ref: const,func
             rows: 1
         filtered: 100.00
            Extra: Using where; Using index
    2 rows in set, 1 warning (0.00 sec)

    优化方案,改写成关联查询

    localhost.user>explain extended select bar.uid from bar_user_6 as bar ,user_atten_3 as user where bid='9279'  and bar.uid = user.a_uid and user.uid='1400696003' limit 12G
    *************************** 1. row ***************************
               id: 1
      select_type: SIMPLE
            table: user
             type: ref
    possible_keys: uid
              key: uid
          key_len: 22
              ref: const
             rows: 1
         filtered: 100.00
            Extra: Using where; Using index
    *************************** 2. row ***************************
               id: 1
      select_type: SIMPLE
            table: bar
             type: eq_ref
    possible_keys: bid
              key: bid
          key_len: 12
              ref: const,user.user.a_uid
             rows: 1
         filtered: 100.00
            Extra: Using index

    子查询的查询过程(循环嵌套):

    for each row in t1 matching range {
      for each row in t2 matching reference key {
        for each row in t3 {
          if row satisfies join conditions,
          send to client
        }
      }
    }

     参考文档:

    http://dev.mysql.com/doc/refman/5.5/en/nested-loop-joins.html

    http://hidba.org/?p=819

    http://hidba.org/?p=624

    http://hidba.org/?p=743

  • 相关阅读:
    Dubbo
    支持微服务架构落地的Java框架
    thinkphp6的主要特性
    thinkphp5的主要特性
    RPC
    HTTP1.0 HTTP1.1 HTTP2.0 主要特性对比
    RabbitMQ 生产环境配置详解
    分布式AKF拆分原则
    通过Hystrix了解分布式接口级的高可用
    Python中使用grpc与consul
  • 原文地址:https://www.cnblogs.com/gsblog/p/3388012.html
Copyright © 2020-2023  润新知