注意:原始问题没有实际意义,但扫描到底部是否有相关内容.
我有一个我想要优化的查询,看起来像这样:
select cols from tbl where col = "some run time value" limit 1;
我想知道正在使用什么键,但无论我传递什么来解释,它都能够将where子句优化为什么("Impossible WHERE注意到......"),因为我给它一个常量.
有没有办法告诉mysql不要在解释中做不断的优化?
我错过了什么吗?
有没有更好的方法来获取我需要的信息?
编辑:EXPLAIN
似乎是给我一个由常量值产生的查询计划.由于查询是存储过程的一部分(并且sproc中的IIRC查询计划在调用之前生成),这对我没有好处,因为该值不是常量.我想要的是找出优化器在不知道实际值是什么时将生成什么查询计划.
我错过了吗?
编辑2:在其他地方询问,似乎MySQL总是重新生成查询计划,除非你不遗余力地重新使用它们.即使在存储过程中.从这看起来我的问题似乎没有实际意义.
然而,这并没有使我真正想知道的事情没有实际意义: 如何优化包含在任何特定查询中不变的值的查询,但我,程序员,事先不知道将使用什么值?- 例如,假设我的客户端代码正在生成一个带有其where
子句中的数字的查询.有时这个数字会导致一个不可能的where子句,否则它将不会.如何使用explain来检查查询的优化程度?
我现在看到的最好的方法是EXPLAIN
在其上运行存在/不存在的情况的完整矩阵.真的,这不是一个非常好的解决方案,因为手动操作既困难又容易出错.
你得到"不可能注意到",因为你指定的值不在列中,而不仅仅是因为它是一个常量.您可以1)使用列中存在的值或2)只说col = col
:
explain select cols from tbl where col = col;