【问题标题】:same query, dramatic different performances on different data. MySQL相同的查询,在不同的数据上表现出戏剧性的不同。 MySQL
【发布时间】:2011-09-21 23:27:05
【问题描述】:

所以,我有一个包含 4000 万个条目的庞大数据库。

查询很简单(a_view 是一个视图!)

select * from a_view where id > x LIMIT 10000

这是我得到的行为:如果 x 是一个小数字 (int),则查询速度非常快。 当 x > 29 百万时,查询开始需要几分钟。如果接近 3000 万,则需要数小时。等等……

这是为什么呢?我该怎么做才能避免这种情况?

我使用 InnoDB 作为引擎,表有索引。

限制值是一个关键值,它会影响性能。如果它很小,查询总是很快。但是如果 x 接近 30Millions,那么我需要非常小心地设置它不要太大(小于 300 百),它仍然很慢,但不会永远持续

如果您需要更多详细信息,请随时询问。

编辑:这里是解释

+----+-------------+--------+--------+------------- ----+---------+---------+---------+--- ------+--------------+ |编号 |选择类型 |表|类型 |可能的键 |关键 | key_len |参考 |行 |额外 | +----+-------------+--------+--------+------------- ----+---------+---------+----------+--- ------+--------------+ | 1 |简单 |啊|索引 |初级 |初级 | 39 |空 | 3028439 |使用索引 | | 1 |简单 |一个 | eq_ref |初级 |初级 | 4 | odb.aH.albumID | 1 |使用位置 | | 1 |简单 |超高压 |参考 | PRIMARY,专辑ID |专辑ID | 4 | odb.a.albumID | 4 | | | 1 |简单 |吨 | eq_ref |初级 |初级 | 4 | odb.aHT.id | 1 |使用位置 | | 1 |简单 |克 | eq_ref |初级 |初级 | 4 | odb.t.genre | 1 | | | 1 |简单 |阿尔 | eq_ref |初级 |初级 | 4 | odb.t.艺术家 | 1 | | +----+-------------+--------+--------+------------- ----+---------+---------+---------+--- ------+--------------+

【问题讨论】:

  • 你确定id列被索引了吗?
  • 什么是表/视图,什么是索引?
  • 理论上,如果你在“id”上有索引,性能应该差别不大。
  • 是的,id 列在它来自的表上被索引,视图是创建连接多个表,所有表都被索引。 @Michael 你说的差别不大是什么意思?我认为我的确实很大
  • 我们需要定义 a_view 来确定问题所在。

标签: mysql performance limit


【解决方案1】:

这是一个猜测。基本上,您的视图是某些表的选择。 “id”可以是行号。 “x”越大,需要创建(和丢弃)的选择行越多,才能获得所需的任何数据。这就是为什么当你的“x”增加时你的查询会变慢。

如果这是真的,一种解决方案可能是创建一个包含 rownum 和主键的表,该主键按您使用的任何“排序依据”排序。获得该表后,您可以将其与其余数据连接起来,并通过 rownum 范围选择您的数据窗口。

【讨论】:

  • 抱歉,我该如何验证是否是问题所在?而且我还不太明白如何创建该表。
  • 我正在考虑不同的想法,以确定您的性能问题可能是什么原因。如果您发布 a_view 定义会有所帮助。特别是“id”对应的是什么?
  • id 对应于 odb.t.id 等于 odb.aHT.id (在解释中)。我在这些列上加入了两个表 t 和 aHT。
猜你喜欢
  • 1970-01-01
  • 2010-10-10
  • 2020-03-12
  • 1970-01-01
  • 2017-03-30
  • 2019-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多