Home  >  Article  >  Database  >  MySQL HINT:Straight_JOIN_MySQL

MySQL HINT:Straight_JOIN_MySQL

WBOY
WBOYOriginal
2016-06-01 13:32:391022browse

bitsCN.com

MySQL HINT:Straight_JOIN

 

 来自生产环境的朋友、可能都会碰到:

     

     原本运行良好的查询语句,过了一段时间后,可能会突然变得很糟糕

     一个很大可能的原因就是数据分布情况发生了变化

     从而导致MySQL优化器对驱动表的选择发生了变化,进而出现索引失效的情况

     所以、闲着蛋疼喝咖啡的时候、应该多收集两下表的统计信息

     

     

     这个时候、Straight_JOIN 闪亮登场

     

     MySQL 只支持 Nested Loop Join、关于这个Nested JOIN的详细用法请参阅偶之前blog:点击打开链接

 

http://www.bitsCN.com/database/201301/186885.html

 

     和Oracle对比下、不然得知、Straight_JOIN相当于Oracle里面的:USE_NL、所以、原理和适用上大概都是相同的、

     不过、对于驱动表的选择、MySQL 优化器可能没有Oracle那般智能、MySQL采用简单粗暴的方法:

     哪个表的结果集小,就以哪个表为驱动表

 

     偶赶脚有2 种原因可令你选择 Straight_JOIN 

     

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

     ② Nested Loop Join 的适用场景:

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

        ==>也就是驱动表的记录集比较小(

  

     一般的优化操作:

     

     

     ① show full processlist;

     ② explain + TOP-SQL ;

     

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

 

     一个经典优化例子:

     

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

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

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

bitsCN.com
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn