range_optimizer_max_mem_size可能导致全表扫描gydF4y2Ba尽管range_optimizer_max_mem_size如何运作中解释gydF4y2Ba官方的文档gydF4y2Ba,这不是一个著名的变量,肯定不是一个变量在大多数情况下您需要修改的。但有时我们得到一些门票相关性能。gydF4y2Ba

这个变量导致什么问题如果不适当大小的吗?让我们来看看一个例子!gydF4y2Ba

鉴于以下表定义:gydF4y2Ba

~ 2 m行gydF4y2Ba

的默认值range_optimizer_max_mem_size = 8388608,以下查询在PK执行非常快!gydF4y2Ba

但是,如果我们减少range_optimizer_max_mem_size假设,500 ?gydF4y2Ba

Woooh !查询执行时间从0.00秒增加到0.82秒!可能会发生什么?让我们检查解释和处理程序:gydF4y2Ba

range_optimizer_max_mem_size = 8388608:gydF4y2Ba

range_optimizer_max_mem_size = 500:gydF4y2Ba

可以看出,有一个查询计划执行更改。默认值,执行计划只使用主键扫描10行,但是减少range_optimizer_max_mem_size之后,全表扫描发生导致2097153行读取!这是不利于性能。gydF4y2Ba

正式的解释这种行为可以被发现gydF4y2Ba官方文档的结尾gydF4y2Ba。gydF4y2Ba

估计所需的内存来处理一系列表达式,您应该检查查询条件,在谓词()的情况下,它将需要230字节/值。出于完整性的考虑,值得知道每个”或“条件在where子句将需要额外的230个字节,每个”和“条件一个额外的125个字节。gydF4y2Ba

默认值为8388608 (MySQL版本5.7.12以上)应该足够的长达一个~ 36473条款的条件。gydF4y2Ba

总之,可以看出,默认值应该足够多对大多数(如果不是全部)查询,但在一个引爆点(或者如果变量配置错误的),它可能会发生一个表现良好的查询变成一个全表扫描,可以损害性能。gydF4y2Ba

2gydF4y2Ba评论gydF4y2Ba
最古老的gydF4y2Ba
最新的gydF4y2Ba 大多数投票gydF4y2Ba
内联反馈gydF4y2Ba
查看所有评论gydF4y2Ba
凯AgahdgydF4y2Ba

有趣的见解,谢谢!gydF4y2Ba
你知道有一个相当于在MongoDB吗?我的意思是,行为类似于当MongoDB在条件包含了许多价值观和MongoDB还提供了一个参数来优化它吗?gydF4y2Ba