简而言之,场景:一个拥有超过1600万条记录[2GB大小]的表。当使用ORDER BY * primary_key
*时,SELECT的LIMIT偏移量越高,查询速度就越慢
所以
SELECT * FROM large ORDER BY `id` LIMIT 0, 30
花费不到
SELECT * FROM large ORDER BY `id` LIMIT 10000, 30
那只订购30条记录,并且无论如何都相同。因此,这不是ORDER BY的开销。
现在,当获取最新的30行时,大约需要180秒。如何优化该简单查询?
通常,较高的偏移量会使查询速度变慢,因为查询需要从第一OFFSET + LIMIT
条记录中扣除(并且只提取其中的一条记录LIMIT
)。该值越高,查询运行的时间越长。
查询无法直接进行,OFFSET
因为,第一,记录的长度可能不同,第二,删除的记录可能会有间隙。它需要检查并计数其途中的每条记录。
假设id
是PRIMARY KEY
一个的MyISAM
表,你可以使用这一招加快步伐:
SELECT t.*
FROM (
SELECT id
FROM mytable
ORDER BY
id
LIMIT 10000, 30
) q
JOIN mytable t
ON t.id = q.id
看到这篇文章:
问题内容: 我试图弄清楚为什么我的查询之一变慢以及如何解决它,但是我对结果有些困惑。 我有一个约80列和775179行的表,并且正在执行以下请求: 在4.5秒内返回38行 删除时,我得到了很好的改进: 0.30秒内38行 但是,如果在不触摸的情况下删除,我会得到更好的结果: 0.10s(??)中的38行 为什么我的LIMIT这么饿? 继续前进 在尝试发送答案之前,我尝试了一些尝试,并注意到我有一个
问题内容: 我有一个与此类似的表: 我想先更换2次出现的用用,然后4下出现,使生成的表如下所示: 当然,所讨论的表要大得多,因此出现的次数也会更多,因此手动编辑不是解决方案。 我想做这样的事情: 但是不幸的是,MySQL似乎在UPDATE查询中不支持OFFSET …有什么办法吗? 问题答案: 尝试这个: 然后
问题内容: 使用大偏移量的mysql 时出现性能问题: 如果偏移量大于1,000,000,则操作非常缓慢。 我必须使用; 我不能使用类似的东西。 如何优化此语句以获得更好的性能? 问题答案: 也许您可以创建一个索引表,该表提供与目标表中的键相关的顺序键。然后,您可以将此索引表连接到目标表,并使用where子句更有效地获取所需的行。
`public class Main{private static Connection connect=null;private static Statement PreparedStatement=null;private static ResultSet ResultSet=null;
本文向大家介绍为什么索引能提高查询速度?相关面试题,主要包含被问及为什么索引能提高查询速度?时的应答技巧和注意事项,需要的朋友参考一下 以下内容整理自: 地址: https://juejin.im/post/5b55b842f265da0f9e589e79 作者 :Java3y 先从 MySQL 的基本存储结构说起 MySQL的基本存储结构是页(记录都存在页里边): 各个数据页可以组成一个双向链表
问题内容: 如标题所述,我想要一个解决方法… 干杯 问题答案: 您可能会希望将an添加到嵌套查询中。