Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 通过只查看最后X行优化SQL查询(而不是简单地限制)_Mysql_Sql - Fatal编程技术网

Mysql 通过只查看最后X行优化SQL查询(而不是简单地限制)

Mysql 通过只查看最后X行优化SQL查询(而不是简单地限制),mysql,sql,Mysql,Sql,我想在一个非常大的表上执行SQL查询。但是,我只需要查看最后100000行。目前: SELECT * FROM bigtable WHERE columna='foobar' ORDER BY id DESC LIMIT 10 我想做同样的,但使它只在最后的X ID看起来 编辑:先选择100k行,然后再从中选择,这不是解决方案。这将选择之前的全部100k行,即使找到了所需行中的10多行。这会使速度变慢。试试看 select * from ( SELECT * FROM bigta

我想在一个非常大的表上执行SQL查询。但是,我只需要查看最后100000行。目前:

SELECT * FROM bigtable WHERE columna='foobar' ORDER BY id DESC LIMIT 10 
我想做同样的,但使它只在最后的X ID看起来

编辑:先选择100k行,然后再从中选择,这不是解决方案。这将选择之前的全部100k行,即使找到了所需行中的10多行。这会使速度变慢。

试试看

select * from 
(
  SELECT * 
  FROM bigtable 
  ORDER BY id DESC
  LIMIT 100000
) x
where columna = 'foobar' 
order by id desc
limit 10
如果查询速度慢,请在
列A
上添加索引

select * from 
(
  SELECT * 
  FROM bigtable 
  ORDER BY id DESC
  LIMIT 100000
) x
where columna = 'foobar' 
order by id desc
limit 10

如果查询速度较慢,则在数据库中的
列a

上添加索引,您无法执行检查“最后x行”的查询。关系数据库不能保证这些行以特定顺序进行物理存储。因此,SQL不允许您表达这一点。如果您可以根据行中包含的数据将其转换为实际约束,那么这将是可能实现的

以您的示例为例,数据库必须执行的最糟糕的操作是在返回数据之前对完整结果集进行排序。这与
limit
子句无关,因为只有在遍历所有行并对它们进行排序后,才能知道哪些行具有最高的ID


但是,如果有一个索引具有
columna
id
,则按照该顺序,数据库引擎应该使用已排序的索引更快地遍历行,从而加快响应时间。

在数据库中,您不能执行检查“最后x行”的查询。关系数据库不能保证这些行以特定顺序进行物理存储。因此,SQL不允许您表达这一点。如果您可以根据行中包含的数据将其转换为实际约束,那么这将是可能实现的

以您的示例为例,数据库必须执行的最糟糕的操作是在返回数据之前对完整结果集进行排序。这与
limit
子句无关,因为只有在遍历所有行并对它们进行排序后,才能知道哪些行具有最高的ID


但是,如果有一个索引具有
columna
id
,则按照该顺序,数据库引擎应该使用已排序的索引更快地遍历行,从而加快响应时间。

bigtable(columna,id
)上创建一个复合索引


MySQL应该足够聪明,可以在索引中查找
列a
中的值,并按第二个键进行排序。这在。

bigtable(columna,id
)上创建复合索引中进行了说明


MySQL应该足够聪明,可以在索引中查找
列a
中的值,并按第二个键进行排序。这在.

中有解释,另请参见:@gladoscc您可以在sql server中执行类似操作,从bigtable中选择top 100000 columnname,其中columna='foobar'按id排序desc@PetrR:这在我的例子中不起作用,因为它选择了完整的10万行,即使它已经找到了10行,但没有限制。我需要的是能够超时查询。另请参见:@gladoscc您可以在sql server中执行类似操作从bigtable中选择top 100000 columnname,其中columna='foobar'按id排序desc@PetrR:这在我的例子中不起作用,因为它选择了完整的10万行,即使它已经找到了10行,但没有限制。我需要的是能够超时查询。此查询正是您想要的。再仔细阅读一遍,再试一次。你编辑了这个查询,但实际上速度较慢。。因为通常它不需要查看整个100000行。然后将其限制为较小的行数。这叫做后期行查找,你可以通过谷歌来了解它的工作原理。这是提高效率的唯一方法,除非您知道需要检查的主键的值,以便可以限制要查看的索引范围。另外,请确保您正确配置了MySQL,因为如果您运行默认配置,那么任何查询优化都不会对您有所帮助。此查询完全符合您的要求。再仔细阅读一遍,再试一次。你编辑了这个查询,但实际上速度较慢。。因为通常它不需要查看整个100000行。然后将其限制为较小的行数。这叫做后期行查找,你可以通过谷歌来了解它的工作原理。这是提高效率的唯一方法,除非您知道需要检查的主键的值,以便可以限制要查看的索引范围。另外,请确保您正确配置了MySQL,因为如果您运行默认配置,任何查询优化都不会对您有所帮助。我正在按id而不是columna进行排序。@gladoscc。您正在
列A
上进行过滤,并在
id
上进行排序。这就是为什么MySQL会对两者都使用这个索引。我在按id而不是columna进行排序。@gladoscc。您正在
列A
上进行过滤,并在
id
上进行排序。这就是为什么MySQL会同时使用这个索引的原因。我已经按照这个顺序添加了一个columna和id的索引,但是性能仍然很慢。有没有办法让查询超时并在X秒后返回它所拥有的内容?我按顺序添加了一个columna和id的索引,但是性能仍然很慢。有没有办法使查询超时,并在X秒后返回它所拥有的内容?