如何使用别名列加快此查询的速度?

How can I speed up this query with an aliased column?

所以我在 SO 上找到了这个代码片段。它本质上是为 MySQL 伪造了一个 "row_number()" 函数。它执行得非常快,这是我喜欢和需要的,但我无法在最后添加 where 子句。

select 
   @i:=@i+1 as iterator, t.* 
from 
   big_table as t, (select @i:=0) as foo

添加 where iterator = 875 会产生错误。

上面的代码片段执行大约需要 .0004 秒。我知道我可以将它包装在另一个查询中作为子查询,但它变得非常慢。

select * from (
   select 
     @i:=@i+1 as iterator, t.* 
   from 
     big_table as t, (select @i:=0) as foo) t
where iterator = 875

上面的代码片段需要 10 多秒才能执行。

想加快速度吗?

你能试试这个吗?

增加 where 子句中变量的值并根据 875 检查它就可以了。

SELECT
    t.*
FROM
    big_table AS t,
    (SELECT @i := 0) AS foo
WHERE
    (@i :=@i + 1) = 875
LIMIT 1

注意事项:

除非您指定一个 order by 子句,否则不能保证您每次获得所需的行号时都会得到相同的行。 MySQL 不能确保这一点,因为 table 中的数据是无序集。

因此,如果您在 some field 上指定了一个订单,那么您不需要用户定义的变量来获取该特定记录。

SELECT
    big_table.*
FROM big_table
ORDER BY big_table.<some_field>
LIMIT 875,1;

如果 some_field 被编入索引,您可以显着提高性能。

在这种情况下,您可以将 LIMIT 用作 WHERE

select 
   @i:=@i+1 as iterator, t.* 
from 
   big_table as t, (select @i:=874) as foo
LIMIT 875,1

因为您只想要记录 875,所以这会很快。