• mysql 从left join 到join到查询计划到联合索引的原理


     

    left join

    left join在无脑使用中,会大表驱动小表,触发笛卡尔集,效率慢

    join会自动小表驱动大表

    参考:

    从一个MySQL left join优化的例子加深对查询计划的理解 
    http://luxuryzh.iteye.com/blog/1976004

    类似优化sql的美团一个文章,他用的是union,感觉也可以用join

    select
             emp.id as emp_id,
             emp_cert.id as cert_id 
          from
             employee emp 
          left join
             emp_certificate emp_cert 
                on emp.id = emp_cert.emp_id 
          where
             emp.is_deleted=0

    相关的explain查询计划解释

    type分为system/const/eq_ref/ref/range/index/ALL等好几类,连接的效率从前往后 
    好。。》 差

    all:木有用到索引 

    index,用到

    range,索引的between in等范围类

    ref 非主键索引

    const 主键索引

    参考:

    MySQL执行计划解读 - ggjucheng - 博客园
    http://www.cnblogs.com/ggjucheng/archive/2012/11/11/2765237.html

    联合索引原理

    假设 a为1,2,3,b也为1,2,3

    把a,b设为联合索引

    则在树中排序方式为(a,b)->

    1 1, 1 2, 1 3,

    2 1, 2 2 ,2 3,

    3 1, 3 2 ,3 3

    只看a, a是有序的,而b不是

    所以在查询中,如果两者在where中都用到了,则不分先后,mysql都会自动用索引,

    如果where中只用了a,也是可以的,因为a有顺序

    如果只用到了b,则查询计划中type为all,即无索引使用。

    前缀索引

    刚才是的二个,如果增加3个,a,b ,c 

    那么使用

    a b c

    a c

    a b

    即除了a以外,只要有a,无关顺序,都可以,mysql version:5.7

    type都是ref, 非主键索引

    例子在

    mysql索引使用技巧及注意事项 - 夏雪冬日 - 博客园
    https://www.cnblogs.com/heyonggang/p/6610526.html

    其它参考:

    MySQL InnoDB联合索引学习 – 运维那点事
    http://www.ywnds.com/?p=11204

     

  • 相关阅读:
    记录一下最近面试的总结
    网络模块相关面试题
    JVM 之类加载器
    一段简单的关于字符串的 Java 代码竟考察了这么多东西
    LeetCode 链表题 ( Java )
    MD5 加盐加密
    SpringMVC 学习笔记
    [redis]dict和rehash
    [redis]SDS和链表
    [go]包和工程管理
  • 原文地址:https://www.cnblogs.com/stevenlii/p/8609900.html
Copyright © 2020-2023  润新知