MySQL HINT:Straight_JOIN
来自生产环境的朋友、可能都会碰到:
原本运行良好的查询语句,过了一段时间后,可能会突然变得很糟糕
一个很大可能的原因就是数据分布情况发生了变化
从而导致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的更多相关文章
- 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 ...
- MySQL错误:The user specified as a definer (XXX@XXX) does not exist
今天由于更换服务器,重新再本地备份了数据库,试运行程序报错,如下: MySQL错误:The user specified as a definer (XXX@XXX) does not exist 意 ...
- MySQL内核:InnoDB存储引擎 卷1
MySQL内核:InnoDB存储引擎卷1(MySQL领域Oracle ACE专家力作,众多MySQL Oracle ACE力捧,深入MySQL数据库内核源码分析,InnoDB内核开发与优化必备宝典) ...
- MySQL查询优化:查询慢原因和解决技巧
在开发的朋友特别是和mysql有接触的朋友会碰到有时mysql查询很慢,当然我指的是大数据量百万千万级了,不是几十条了,下面我们来看看解决查询慢的办法. MySQL查询优化:查询慢原因和解决方法 会经 ...
- mysql语句:批量更新多条记录的不同值[转]
mysql语句:批量更新多条记录的不同值 mysql更新语句很简单,更新一条数据的某个字段,一般这样写: 帮助 1 UPDATE mytable SET myfield = 'value' WHERE ...
- 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 ...
- PHP的MySQL扩展:MySQL数据库概述
来源:http://www.ido321.com/1023.html 一.SQL:结构化查询语言 SQL(Structured Query Language)是高级的非过程化变成语言,专门用于查询和修 ...
- Mysql异常:MySQLNonTransientConnectionException: No operations allowed after statement closed
Mysql异常:MySQLNonTransientConnectionException: No operations allowed after statement closed MySQLNonT ...
- cmd连接mysql连接:mysql-h主机地址-u用户名-p用户密码(注:u与root可以不用加)
MySQL导入导出命令1.导出整个数据库 mysqldump -u 用户名 -p 数据库名 > 导出的文件名 mysqldump -u wcnc -p smgp_apps_wcnc >wc ...
随机推荐
- spark论坛
http://spark.apache.org/ http://bbs.csdn.net/forums/spark http://spark.csdn.net/ http://tieba.baidu. ...
- 在程序中,你敢怎样使用“goto”语句!
用goto是一个个人爱好的问题.“我”的意见是,十个goto中有九个可以用相应的结构化结构来替换.在那些简单情形下,你可以完全替换掉goto,在复杂的情况下,十个中也有九个可以不用:你可以把部分代码写 ...
- 【剑指Offer学习】【面试题17 ::合并两个排序的链表】
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是依照递增排序的 链表结点定义例如以下: public static class ListNode { int value; List ...
- spring mvc 与 jquery ajax
在 Spring mvc3中,响应.接受 JSON都十分方便. 使用注解@ResponseBody可以将结果(一个包含字符串和JavaBean的Map),转换成JSON. 使用 @RequestBod ...
- NProxy——Mac和Linux平台下的Fiddler
Fiddler 相信大家,尤其是前端工程师们都知道. 用它的文件替换功能,将线上的静态资源文件(JS.CSS.图片)替换为本地相应的文件,来调试线上(代码都被压缩过)UI的问题.的确是一神器.(相比, ...
- 怎样学好C++语言
昨天写了一篇怎样学好C语言,就有人回复问我怎样学好C++,所以,我把我个人的一些学习经验写在这里,希望对大家实用.首先,由于怎样学好C语言中谈到了算法和系统,所以这里就仅仅谈C++语言. C++是最难 ...
- Ubuntu下SVN命令行递归加入文件夹文件(免去一个一个的加入 --force)
因为在Linux下一直没有找到好的svn工具(类似于TortiseSVN的).当然eSVN这些也不错,但就是使用上认为还不是很习惯.终于还是选择了svn原始的命令行工具来进行版本号控制操作. 命令行的 ...
- MSSQL - SqlDataAdapter连接数据库提高性能用法
SqlDataAdapter 与 SqlConnection 和 SqlCommand 一起使用,以便在连接到 SQL Server 数据库时提高性能. SqlDataAdapter 的这一实现自动打 ...
- linux命令:ftp
1. 登录: ftp IP_ADDR : 根据提示输入USER_NAME PASS_WORD 或: ftp -i -n IP_ADDR user USER_NAME PASS ...
- 用QT打开网页
原地址:http://blog.csdn.net/fjb2080/article/details/8136084 1.用qlabel. QLabellabel->setText(tr(" ...