我在mysql中使用order有问题。我有一个名为“site”的表,有3个字段,如id,name,rank。该表包含大约1.4米的记录。当我应用查询时,
select name from site limit 50000,10;
它在7.45秒内返回10条记录[通过终端检查]。但是当我在上面的查询中使用order by时,
select name from site order by id limit 50000,10;
查询似乎永远不会完整。由于id被设置为主键,我认为它不需要另一个索引来加速我的查询。但我不知道错误在哪里。
非常感谢任何帮助,谢谢。
答案 0 :(得分:3)
这是“值得期待的”,值LIMIT
:{/ p>
来自http://www.mysqlperformanceblog.com/2006/09/01/order-by-limit-performance-optimization/
小心大限制如果需要,使用索引进行排序是有效的 前几行,即使你需要一些额外的过滤 按LIMIT请求按索引扫描更多行。但是,如果你是 处理具有大偏移效率的LIMIT查询将受到影响。 LIMIT 1000,10可能比LIMIT 0,10慢。是真的 大多数用户的搜索结果不会超过10页 引擎机器人可能会这样做。我见过机器人看了200多页 在我的项目中。此外,许多网站都没有处理这个问题 提供非常简单的任务来启动DOS攻击 - 请求页面 来自少数几个连接的大量数字就足够了。如果你不 做任何事情确保你阻止页面太大的请求 号。
对于某些情况,例如,如果结果是静态的,则可能有意义 预计算结果,以便您可以查询它们的位置。而不是 使用LIMIT 1000,10进行查询时,您将在1000和之间有WHERE位置 1009对任何位置具有相同的效率(只要它是 索引)
和
关于ORDER BY的另一个注意事项...... LIMIT是 - 它提供了可怕的解释 语句可能最终在慢查询日志中作为查询而不是 使用索引
最后一点是您案例中的重点 - ORDER BY
和LIMIT
与大表(1.4m)和“不使用索引”的组合(即使有索引! )在这种情况下,性能真的很慢......
编辑 - 根据评论:
对于这种特定情况,您应该使用select name from site order by id
并在您的代码中将结果集拆分为50,000个块!
答案 1 :(得分:1)
你可以试试这个:
SELECT name
FROM site
WHERE id >= ( SELECT id
FROM site
ORDER BY id
LIMIT 50000, 1
)
ORDER BY id
LIMIT 10 ;