【问题标题】:how to increase performance of limit ?,1 when the ? is a huge number如何提高极限?,1时的性能?是一个巨大的数字
【发布时间】:2011-03-30 07:56:06
【问题描述】:

我有一种情况,我需要使用一个巨大的数字来限制。例如,

"select * from a table limit 15824293949,1";

这……真的很慢。有时我家的 mysql 服务器就死了。

有没有可能让它更快?

抱歉,号码是 15824293949,而不是 38975901200

添加:

**表“照片”(示例)** 相片 img_id img_filename 1个.jpg 2 b.jpg 3 c.jpg 4 d.jpg 5.jpg 等等
select cp1.img_id,cp2.img_id from photos as cp1 cross join photos as cp2 limit ?,1

我如何获得 15824293949?

我的照片表中有 177901 行。我可以通过使用来获得可能组合的总数

(总行数 * 总行数) - 总行数)/2

【问题讨论】:

  • 你的意思是没有限制这个选择执行得更快?
  • 您有一个包含 380 亿行的表?
  • @WhiteFang34 // 交叉连接生成38行票据
  • 如果你只需要一个交叉连接的结果,那么我怀疑你需要一个不同的查询。您必须将其包含在此处供人们分析,我们无法预测您在做什么。
  • 你想做什么?看起来您想要两个图像的第 n 个组合。我会尝试用一种可能的方式在下面更新我的答案。

标签: mysql performance limit


【解决方案1】:

MySQL 在 MyISAM 引擎中存在巨大的限制偏移问题,主要是在 InnoDB 优化的地方。有多种技术可以让 MyISAM 限制运行得更快,但是在您的 select 语句之前添加 EXPLAIN 以查看实际发生的情况。交叉连接生成的 30 亿行表明问题出在连接本身,而不是 LIMIT 子句。 如果您对如何使 LIMIT 表现得更快感兴趣,this link 应该为您提供足够的信息。

【讨论】:

  • 谁能确认 InnoDB 不存在这个问题?
  • @eisberg:我可以确认它在较小程度上确实如此:explainextended.com/2011/02/11/late-row-lookups-innodb
  • 请注意,我没有说问题不存在 - 它确实存在,但 InnoDB 优化了 LIMIT OFFSET 由于聚集索引和存储某些列的方式。 explainextended.com 上优化 LIMIT OFFSET 的技巧对 InnoDB 很有用,但并非总是如此。
【解决方案2】:

尝试在具有索引的列上使用WHERE 子句限制查询。例如:

SELECT * FROM table WHERE id >= 38975901200 LIMIT 1

更新:我想也许你甚至不需要数据库?您可以通过计算 15824293949 / 17790115824293949 % 177901 之类的值来找到两个图像的第 n 个组合。我想你可以写一个查询:

SELECT (15824293949 / 177901) AS img_id1, (15824293949 MOD 177901) AS img_id2

如果您试图从它们在数据库中的自然顺序中获取它们(并且它恰好不是它们的 img_id),那么您可能会遇到一些麻烦。有关系吗?不清楚您要在这里做什么。

【讨论】:

  • @WhiteFang34 // 如果我使用连接查询怎么办?行数是 38975901200 ,但我没有大于 301228 的 id
  • 也许您可以在问题中包含联接查询?
  • @WhiteFang34 // 刚刚添加了我的查询
  • @WhiteFang34 // 顺便说一下,号码是 15824293949。
  • @WhiteFang34 // 我正在建立一个摄影比赛网站。用户应该从数据库中随机看到一组两张照片。并且用户不应该遇到他们已经见过的照片。我认为可能有一个不使用数据库的解决方案。
【解决方案3】:

大概你在某种脚本中有这个,你查看那个特定点的原因是因为它是你最后离开的地方。

理想情况下,如果您还有一个 auto_increment 主键字段(一个 id),您可以存储该数字。然后只需从 id > last_seen_id 限制 1 的表中选择 *(可能一次做超过 1 个:P)

一般来说,您要求它执行的操作应该很慢。给它一些搜索的东西,而不是所有有限制的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 2023-03-31
    • 1970-01-01
    • 2020-06-18
    相关资源
    最近更新 更多