8.6跟踪清除调优

这是用

设置optimizer_trace_offset = < >抵消,optimizer_trace_limit = < >限制

其中OFFSET是有符号整数,LIMIT是正整数。optimizer_trace_offset的默认值是-1;optimizer_trace_limit的默认值是1。SET语句有以下效果:

  • 所有记忆的痕迹都被清除了

  • 的后面的SELECTOPTIMIZER_TRACE表返回OFFSET最古老的记忆轨迹(如果OFFSET≥0)的第一个LIMIT轨迹,或第一个LIMIT轨迹

(-OFFSET)最新记忆的轨迹(如果OFFSET < 0)。

例如,OFFSET=-1和LIMIT=1的组合将显示最后一个跟踪(默认值),OFFSET=-2和LIMIT=1将显示倒数第二个跟踪,OFFSET=-5和LIMIT=5将显示最后5个跟踪。当我们知道有趣的子语句是存储例程的最后几个语句时,这样的负OFFSET是有用的,像这样:

设置optimizer_trace_offset = 5, optimizer_trace_limit = 5;调用stored_routine ();SELECT * FROM information_schema.OPTIMIZER_TRACE;#只看到最后5个痕迹

相反,当知道感兴趣的子语句是存储的例程的少数第一个语句时,正OFFSET可能很有用。

这两个变量调整得越准确,所使用的内存就越少。例如,OFFSET=0和LIMIT=5将使用内存来记住5个跟踪,因此如果只需要前面的3个跟踪,那么OFFSET=0和LIMIT=3更好(跟踪在LIMIT跟踪之后停止,因此不会创建第4和第5个跟踪,也不会占用内存)。一个存储的例程可能有一个循环,它执行许多子语句,从而生成许多跟踪,这将使用大量内存;例如,适当的OFFSET和LIMIT可以将跟踪限制为循环的一次迭代。这也提高了速度,因为跟踪子语句会影响性能。

如果OFFSET≥0,则内存中只保留LIMIT跟踪。如果OFFSET<0,则不成立:相反,(-OFFSET)跟踪保存在内存中;实际上,即使LIMIT小于(-OFFSET),因此排除了最后一条语句,最后一条语句仍然必须被跟踪,因为它将在执行另一条语句后位于LIMIT内部(记住,OFFSET<0是从末尾开始计数的:“窗口”随着更多语句的执行而滑动)。

这样的内存和速度增益就是为什么要提供optimizer_trace_offset和optimizer_trace_limit(这是在跟踪生成器级别的限制)的原因。它们比使用要好

Select * from optimizer_trace limit < limit > offset < offset >;

这是对跟踪使用者级别的限制,几乎没有节省任何东西。