我有一个带有int字段的表,我们称之为createTime 该表包含数百万条记录。 现在我想运行查询:

select * from `table` order by `createTime` desc limit 500000, 10

我已经为createTime创建了一个索引,但查询运行速度很慢。 什么原因? 我怎样才能改进它?

这是EXPLAIN所说的:

id 1
select_type simple
table table
type index
possible_keys null
key createTime
key_len 4
ref null
rows 500010
extra

至于偏移量,当它很小时它的工作速度要快得多。

===============>>#1 票数:9 已采纳

一般规则: 避免大表的OFFSET

[A]偏移量增加,查询执行所需的时间逐渐增加,这可能意味着处理非常大的表将花费很长时间。 原因是因为offset对表中没有索引的行的物理位置起作用。 因此,要在偏移量x处找到行,数据库引擎必须遍历从0到x的所有行。

一般的经验法则是“绝不使用限制条款中的偏移量”。 对于小型表,您可能不会注意到任何差异,但对于超过一百万行的表,您将看到巨大的性能提升。

===============>>#2 票数:2

如果您有一个唯一的列,则可以加快速度。 理想情况下,它将是createTime本身:

SELECT "table".*
  FROM "table"
  INNER JOIN (
    SELECT "createTime"
      FROM "table"
      ORDER BY "createTime" DESC
      LIMIT 500000, 10
  ) AS "limit" ON "table"."createTime" = "limit"."createTime"

如果createTime不是唯一的,但是您有另一个唯一的列,那么您可能会发现需要在createTime和另一列上创建复合索引,以便此查询有效运行:

SELECT "table".*
  FROM "table"
  INNER JOIN (
    SELECT "createTime", "unique"
      FROM "table"
      ORDER BY "createTime" DESC
      LIMIT 500000, 10
  ) AS "limit" ON "table"."unique" = "limit"."unique"

===============>>#3 票数:0

我认为索引不会改变任何东西。 使用offset, limit意味着“读取偏移+限制数据集并丢弃它们(数量偏移)”。 如果你真的想要为这么大的表分页或类似的东西,你应该使用一种方法,你可以在查询的WHERE部分限制你的结果。 这些类型的查询将受益于正确的索引。

使用日期时,解决方案可能是使用时隙来显示数据。 例如,您可以显示一周中每一天的链接,并构建您的查询,例如“WHERE createDate>'2011-12-11'and crateDate << 2011-12-12'。

  ask by Sebastian Nowak translate from so

未解决问题?本站智能推荐:

3回复

MySQL:如果使用LIMIT 1而不是LIMIT 5,查询执行速度会大大降低

如果我将查询限制为1而不是5,我注意到速度急剧下降。 代替 我的表包含大约12,000,000行,具有以下结构: 这些是对LIMIT 5的速度测量的解释: 这些是对LIMIT 1的速度测量的解释: 有人可以向我解释这种行为吗? 我提到它是由于不同的索引是
4回复

在索引/唯一字段上进行查询时,使用MySQL“ LIMIT 1”有什么意义吗?

例如,我正在查询一个我知道会是唯一且已编入索引(例如主键)的字段。 因此,我知道此查询将仅返回1行(即使没有LIMIT 1) SELECT * FROM tablename WHERE tablename.id=123 LIMIT 1 或仅更新1行 UPDATE tablena
1回复

当结果不足时,按时间限制MySQL查询

我有一个大表,有670k行,并且我正在运行带有大量WHERE的SELECT来搜索和过滤有用的结果,有时候选择的过滤器没有结果,查询遍及整个表并且要花费很多时间,如果在30秒内未找到任何结果,我想停止查询。 这是我的查询: 我尝试运行子查询而不是加入查询,但是它没有加快查询速度。
1回复

MySQL全文不足。 创建索引将超过1000个字节的限制。 那该怎么办?

以下是涉及的列: 当我尝试创建所有这些列的索引时出现此错误: MySQL#1071-指定的密钥太长; 最大密钥长度为1000个字节 考虑到该索引对数据库非常重要,我该怎么办? 我需要允许用户使用单个搜索字段来搜索表单中的所有字段。 所以我正在使用此查询: 我
4回复

选择前100行后如何停止或限制选择?

我有这样的查询- 这个耗时4分钟。 我在evedate上有一个索引。 CDR表包含从'2013-10-01'到'2013-10-30'每天的2400000条记录。 但是我只选择前100条记录。 我想如何优化此查询。 我使用了limit子句,但是没有任何好处。 因此
2回复

表加入限制和性能提升

背景:我正在写一个内部SEO爬虫来检查我们在谷歌的位置。 爬行工作非常出色,存储很好,但我现在遇到显示数据的性能问题(目前存储表有超过1100万条记录,大小超过6.0GB。) 我试图创建一个SQL查询,这将让我从所有记录input_keywords表,然后最后的结果从rank_resul
3回复

如何提高性能限制?,1时? 是一个巨大的数字

我有一种情况,我需要使用一个巨大的数字作为限制。 例如, 这......真的很慢。 有时我家的mysql服务器就死了。 有可能让它更快吗? 对不起,这个号码是15824293949 ,而不是38975901200 添加: 我怎么得到15824293949?
1回复

删除和更新mysql查询中的限制重要性

假设我有一个包含多个列的MySQL用户表,其中一列是用户ID(不能有重复的条目)。 当删除或更新特定行时,我应该使用LIMIT 1,是否比删除和更新查询没有限制更快? 那么, DELETE FROM users WHERE id=123 LIMIT 1比DELETE FROM users
1回复

当限制转到最后一条记录时,mysql查询变慢

我有一个Java应用程序,我想从表中获取一些数据并显示在应用程序中。 我有数百万条记录,当我转到最后一条记录时,查询变得非常缓慢。 需要几分钟才能得到结果。 上面的查询返回快速结果。 即首页返回很快。 但是,当我移动最后一页时,它会变慢。 此查询速度很慢,耗时17秒。
2回复

向MySQL查询添加限制子句会大大减慢它的速度

我正在尝试解决MySQL上的性能问题,因此我想创建一个较小版本的表来使用。 当我向查询添加LIMIT子句时,它从大约2秒(对于完整插入)到天文(42分钟)。 player_record表中有2000万行,所以我在内存中为我想要比较的特定日期创建了两个表。 date_curr有2