zoukankan      html  css  js  c++  java
  • mysql-STRAIGHT_JOIN-优化

    性能提升神器-STRAIGHT_JOIN,在数据量大的联表查询中灵活运用的话,能大大缩短查询时间。

    首先来解释下STRAIGHT_JOIN到底是用做什么的:

    STRAIGHT_JOIN is similar to JOIN, except that the left table is always read before the right table. 
    This can be used for those (few) cases for which the join optimizer puts the tables in the wrong order.

    意思就是说STRAIGHT_JOIN功能同join类似,但能让左边的表来驱动右边的表,能改表优化器对于联表查询的执行顺序。

    接下来我们举个例子进行大致的分析:

    select t1.*
    from table1 t1
    inner join table2 t2
    on t1.id= t2.id
    where t1.code= 1

    以上sql大数据量下执行需要30s,是不是很奇怪?明明Table1表的FilterID字段建了索引啊,Table1和Table2的CommonID也建了索引啊。通过explain来分析,你会发现执行计划中表的执行顺序是Table2->Table1。这个时候要略微介绍下驱动表的概念,mysql中指定了连接条件时,满足查询条件的记录行数少的表为驱动表;如未指定查询条件,则扫描行数少的为驱动表。mysql优化器就是这么粗暴以小表驱动大表的方式来决定执行顺序的

    但如下sql的执行时间都少于1s:

    select t1.*
    from table1 t1
    where t1.code= 1

    select t1.*
    from table1 t1
    inner join table2 t2
    on t1.id= t2.id

    公司的DBA使佣STRAIGHT_JOIN进行,我们对sql进行改造如下:

    select t1.*
    from table1 t1
    STRAIGHT_JOIN  table2 t2
    on t1.id= t2.id
    where t1.code= 1

    用explain进行分析,发现执行顺序为Table1->Table2,这时就由Table1来作为驱动表了,Table1中相应的索引也就用上了,执行时间竟然低于1s了。

    分析到这里,必须要重点说下:

    • STRAIGHT_JOIN只适用于inner join,并不使用与left join,right join。(因为left join,right join已经代表指定了表的执行顺序)
    • 尽可能让优化器去判断,因为大部分情况下mysql优化器是比人要聪明的。使用STRAIGHT_JOIN一定要慎重,因为啊部分情况下认为指定的执行顺序并不一定会比优化引擎要靠谱。
  • 相关阅读:
    SqlParameter的作用与用法
    自制ASP.NET 本地授权文件
    教你如何谷歌浏览器免费打电话
    grep命令
    前端培训
    环境变量
    jenkins执行脚本npm: command not found解决
    Linux下给mysql创建用户并分配权限
    h5视频微信禁止全屏 x5-playsinline
    git 删除本地分支和远程分支、本地代码回滚和远程代码库回滚
  • 原文地址:https://www.cnblogs.com/cat520/p/12189354.html
Copyright © 2011-2022 走看看