如何使用别名列加快此查询的速度?
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,所以这会很快。
所以我在 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,所以这会很快。