来自生产环境的朋友、可能都会碰到:
     
     原本运行良好的查询语句,过了一段时间后,可能会突然变得很糟糕
     一个很大可能的原因就是数据分布情况发生了变化
     从而导致MySQL优化器对驱动表的选择发生了变化,进而出现索引失效的情况
     所以、闲着蛋疼喝咖啡的时候、应该多收集两下表的统计信息
     
     
     这个时候、Straight_JOIN 闪亮登场
     
     
     MySQL 只支持 Nested Loop Join、关于这个Nested JOIN的详细用法请参阅偶之前blog:点击打开链接
     和Oracle对比下、不然得知、Straight_JOIN相当于Oracle里面的:USE_NL、所以、原理和适用上大概都是相同的、
     不过、对于驱动表的选择、MySQL 优化器可能没有Oracle那般智能、MySQL采用简单粗暴的方法:
     哪个表的结果集小,就以哪个表为驱动表
     
     
     
     
偶赶脚有2 种原因可令你选择 Straight_JOIN 

     

     ① MySQL 优化器不给力、错误选择驱动表

     ② Nested Loop Join 的适用场景:

        ==>一般用在连接的表中有索引,并且索引选择性较好(也就是Selectivity接近1)的时候

        ==>也就是驱动表的记录集比较小(<10000)而且inner表需要有有效的访问方法(Index)

        

        

        

        

     
一般的优化操作:

     

     

     ① show full processlist; <===查找TOP-SQL 

     ② explain + TOP-SQL ; <===查询SQL 执行计划

     

     注意:在EXPLAIN结果中,第一行出现的表就是驱动表

     

     

     

     

     
一个经典优化例子:

     

     当explian输出结果中含:「Using filesort」,甚至「Using temporary」

     我们就该擦亮双眼、像打了鸡血一样、保持时刻优化的姿态

此刻的优化就容易多了、尽可能保证排序字段在驱动表中

By David Lin

2013-06-23

Good Luck

MySQL HINT:Straight_JOIN的更多相关文章

  1. Windows mysql提示:1045 access denied for user 'root'@'localhost' using password yes

    Windows mysql提示:1045 access denied for user 'root'@'localhost' using password yes http://blog.csdn.n ...

  2. MySQL错误:The user specified as a definer (XXX@XXX) does not exist

    今天由于更换服务器,重新再本地备份了数据库,试运行程序报错,如下: MySQL错误:The user specified as a definer (XXX@XXX) does not exist 意 ...

  3. MySQL内核:InnoDB存储引擎 卷1

    MySQL内核:InnoDB存储引擎卷1(MySQL领域Oracle ACE专家力作,众多MySQL Oracle ACE力捧,深入MySQL数据库内核源码分析,InnoDB内核开发与优化必备宝典) ...

  4. MySQL查询优化:查询慢原因和解决技巧

    在开发的朋友特别是和mysql有接触的朋友会碰到有时mysql查询很慢,当然我指的是大数据量百万千万级了,不是几十条了,下面我们来看看解决查询慢的办法. MySQL查询优化:查询慢原因和解决方法 会经 ...

  5. mysql语句:批量更新多条记录的不同值[转]

    mysql语句:批量更新多条记录的不同值 mysql更新语句很简单,更新一条数据的某个字段,一般这样写: 帮助 1 UPDATE mytable SET myfield = 'value' WHERE ...

  6. mysql 1449 : The user specified as a definer ('root'@'%') does not exist ,mysql 赋给用户权限 grant all privileges on

    mysql 1449 : The user specified as a definer ('root'@'%') does not exist 解决方法 遇到了 SQLException: acce ...

  7. PHP的MySQL扩展:MySQL数据库概述

    来源:http://www.ido321.com/1023.html 一.SQL:结构化查询语言 SQL(Structured Query Language)是高级的非过程化变成语言,专门用于查询和修 ...

  8. Mysql异常:MySQLNonTransientConnectionException: No operations allowed after statement closed

    Mysql异常:MySQLNonTransientConnectionException: No operations allowed after statement closed MySQLNonT ...

  9. cmd连接mysql连接:mysql-h主机地址-u用户名-p用户密码(注:u与root可以不用加)

    MySQL导入导出命令1.导出整个数据库 mysqldump -u 用户名 -p 数据库名 > 导出的文件名 mysqldump -u wcnc -p smgp_apps_wcnc >wc ...

随机推荐

  1. vi编辑器使用介绍

    vi是linux下使用及其广泛的一个编辑器,虽然看上去很简单,但实际功能强大. 使用vi,核心就是熟悉它的一些命令.vi的命令非常多,但我们常用的实际就那几种. 下面将vi最核心的使用点介绍下. 一. ...

  2. PHP - 点击更换头像

    原理: 操作流程: 首先点击头像图片,弹出选择窗口,选中其中一个则窗口推出头像更换. 效果: 主页面代码: <tr> <td>头像:</td> <td> ...

  3. excel通过转成xml格式模板,下载成excel文件

    源代码: report ztest_down_excel. data: begin of i_file occurs , val() type c, end of i_file. data begin ...

  4. android如何用adb shell启动应用程序

    昨天研究了很久,可能由于基础比较菜吧,所以,没有搜到一个可以直接解决问题的,需要综合几个之后,问题得以解决,记下方法,为了方便自己之后遇到同样问题,也为了方便搜索同样问题的朋友. 主要用到了aapt和 ...

  5. 终于懂了:FWinControls子控件的显示是由Windows来管理,而不是由Delphi来管理(显示透明会导致计算无效区域的方式有所不同——透明的话应减少剪裁区域,所以要进行仔细计算)

    在研究TCustomControl的显示过程中,怎么样都找不到刷新FWinControls并重新显示的代码: procedure TWinControl.PaintHandler(var Messag ...

  6. c++中一个类所占用的空间

    看到阿里的一道笔试题: #pragma pack(2) class A { int i; union U { char buff[13]; int i; }u; void foo() { } type ...

  7. 开源JDBC工具类DbUtils

    本篇将会详细地介绍Apache公司的JDBC帮助工具类DbUtils以及如何使用.在上一篇中我们已经通过将以前对dao层使用JDBC操作数据库的冗余代码进行了简易封装形成自己的简单工具类JdbcUti ...

  8. git使用说明

    1,git clone git://github.com/schacon/simplegit.git git工作目录,暂存目录,本地代码仓库都有代码了. 2,git pull git://github ...

  9. 从零开始学C++之异常(一):C语言错误处理方法、C++异常处理方法(throw, try, catch)简介

    一.C语言错误处理方法 1.返回值(if … else语句判断错误) 2.errno(linux 系统调用) 3.goto语句(函数内局部跳转) 4.setjmp.longjmp(Do not use ...

  10. EasyUI - 使用一般处理程序 HttpHandler (.ashx)

    以easyui中的panel中,使用url加载数据为列. 效果: html代码: <div id="p" style="padding: 10px;"&g ...