mysql按查询问题排序

时间:2011-09-17 05:28:18

标签: mysql sql sql-order-by

我在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被设置为主键,我认为它不需要另一个索引来加速我的查询。但我不知道错误在哪里。

非常感谢任何帮助,谢谢。

2 个答案:

答案 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 BYLIMIT与大表(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 ;