我有一个看起来像这样的查询:
select
id
, int1
, int2
, (select count(*) from big_table_with_millions_of_rows
where id between t.int1 and t.int2)
from myTable t
where
....
此选择仅返回一行。内联选择中使用的 id 是索引列(主键)。如果我用这一行返回的 int1/int2 的值替换t.int1
and ,查询将在毫秒内完成。t.int2
如果我按上述方式执行查询——即引用int1/int2,大约需要10 分钟。当我运行分析器并查看实际发生的情况时,我发现 99% 的时间引擎都忙于从内联查询返回数据。看起来好像 MySql 实际上正在运行
select ... from big_table_with_millions_of_rows
在应用之前的内联查询的位
where id between t.int1 and t.int2
有点结果。这是真的吗?如果不是,那是怎么回事?我一直认为 inlineSELECT
具有潜在危险,因为它们作为查询的最后一个元素逐行执行,但是对于这种情况,初始SELECT
确实具有高度选择性,它可能非常有效。任何人都可以对此有所了解吗?
编辑:感谢到目前为止的反馈。我关心的不是内联查询的逐行性质,而是当面对变量而不是(相同的)硬编码值时它似乎无法使用主键索引这一事实。我的猜测是,如果最近没有运行 ANALYZE,那么优化器假定它必须进行表扫描,因为它不了解数据分布。但是,范围查找是在主键上完成的事实不应该弥补这一点吗?