来自生产环境的朋友、可能都会碰到: 原本运行良好的查询语句,过了一段时间后,可能会突然变得很糟糕 一个很大可能的原因就是数据分布情况发生了变化 从而导致mysql优化器对驱动表的选择发生了变化,进而出现索引失效的情况 所以、闲着蛋疼喝咖啡的时候、应
来自生产环境的朋友、可能都会碰到:
原本运行良好的查询语句,过了一段时间后,可能会突然变得很糟糕
一个很大可能的原因就是数据分布情况发生了变化
从而导致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)的时候
==>也就是驱动表的记录集比较小(
一般的优化操作:
① show full processlist;
② explain + top-sql ;
注意:在explain结果中,第一行出现的表就是驱动表
一个经典优化例子:
当explian输出结果中含:「using filesort」,甚至「using temporary」
我们就该擦亮双眼、像打了鸡血一样、保持时刻优化的姿态
此刻的优化就容易多了、尽可能保证排序字段在驱动表中