在上一篇文章中,Hua与您分享了JOIN的初始优化,以及两个相应的算法索引嵌套环(NLJ)和嵌套嵌套环(NLJ)(BNL)。阅读上一篇文章的朋友应该知道BNL算法很大,这是由于查询过程中的大量次数(两个表的两个表中的数量),这在内存中非常消耗,而且很明显,有优化的空间。NLJ算法实际上是好的。它可以继续优化吗?
本文解释了以下知识点:
您需要在这里知道一个知识点,什么是回报表?这是MySQL在根据辅助索引查询数据过程中的粗略解释:
- A是辅助索引,T表中有一个字段ID,A,B
从ts选择 * = 50
上面的过程称为返回表。返回手表的最大缺点是随机访问。例如,我们可以从撕裂a> 10和a <100中找到选择ID的范围。在实际需求下,我们获得的主要键不一定会增加,并且在回流表中将生成大量随机访问,这极大地影响了性能。
如何解决这种情况,此处介绍了MRR算法。
MRR算法的全名是多范围阅读。这是MySQL 5.6介绍的一项新功能。其目的是减少随机访问磁盘并使用顺序读取。
以上没有说退货表可能会导致大量随机访问,从而影响性能。对MRR方法的简单理解是首先在内存中对您排序,以确保ID增加,然后查询,以便您可以尽可能多地尝试,以至于阅读磁盘时,它将在为了提高性能。
例如,以上示例中的范围查询A的值(10,100)可以分解为以下步骤:
READ_RND_BUFFER:在由READ_RNDD_BUFFER_SIZE变量定义的内存大小中,默认256K
以上是MRR的执行过程。它的优势是它针对句子的范围。对大量主密钥ID进行排序后,它可以确保按顺序读取和编写主密钥索引,从而提高性能。
我们可以通过设置参数打开MRR
通过执行该计划,我们可以额外看到我们已经打开了MRR。
MySQL 5.6引入了批处理的密钥访问(称为BKA),这是NLJ算法的优化。NLJ算法在上一章中知道了其内部原理。检查文章。
NLJ算法实际上很好,但是该算法是通过单个值匹配结果,因此我们可以同时将多个值传递到T2表吗?现在我们正在研究上面的MRR。
实际上,BKA确实基于MRR算法。观察下面的图片。查询查询时,将取出驱动器表的数据。如果无法放置JOIN_BUFFER,将执行分段策略,然后将执行MRR算法。
我们可以通过设置参数打开BAK。
在上一章中,我们完成了BNL算法,并且也知道该算法的缺点。总而言之,可以得出以下几点:
对于上面发生的问题,对我们来说,最简单的方法是在驱动器表上创建新索引,但是此方法并不适合所有情况。例如,在我们的示例中,驱动器表中有数千万数据,同时querysql是低频SQL,直接添加索引非常浪费。
还有另一种方法可以添加临时表,一般过程如下:
总体而言,上述方法的目的是使用索引来触发BAK算法以提高性能。
通过本文,总结了以下几点: