mysql按查询排序问题

mysql按查询排序问题,mysql,sql,sql-order-by,Mysql,Sql,Sql Order By,我在mysql中使用order by时遇到了一些问题。我有一个名为“site”的表,有3个字段,如id、name、rank。该表包含约140万条记录。当我像这样应用查询时 select name from site limit 50000,10; select name from site order by id limit 50000,10; 它在7.45秒内返回10条记录[通过终端检查]。但是当我在上面的查询中使用orderby时 select name from site li

我在mysql中使用order by时遇到了一些问题。我有一个名为“site”的表,有3个字段,如id、name、rank。该表包含约140万条记录。当我像这样应用查询时

select name from site limit 50000,10;  
select name from site order by id limit 50000,10;  
它在7.45秒内返回10条记录[通过终端检查]。但是当我在上面的查询中使用orderby时

select name from site limit 50000,10;  
select name from site order by id limit 50000,10;  
这个查询似乎永远都不完整。由于id被设置为主键,我认为它不需要另一个索引来加速我的查询。但我不知道哪里出了错

非常感谢您的帮助。

这是具有较大
限制的“预期”值:

如果您需要,请注意使用索引进行排序是非常有效的 前几行,即使发生了一些额外的过滤,所以您需要 按索引扫描更多行,然后按限制请求。但是如果你 处理冲销效率高的限额查询将受到影响。 限制1000,10可能比限制0,10慢得多。这是真的 然而,大多数用户在搜索结果时不会超过10页 引擎机器人很可能会这样做。我见过机器人浏览200多页的网页 在我的项目中。对于许多未能解决这一问题的网站来说也是如此 提供启动DOS攻击的非常简单的任务–请求页面 从很少的连接中得到一些大的数字,这就足够了。如果你不 执行任何其他操作,确保阻止页面太大的请求 数字

对于某些情况,例如,如果结果是静态的,那么 预计算结果,以便查询位置。所以不是 查询限制为1000,10您的位置将在1000和1000之间 1009对于任何位置都具有相同的效率(只要是 索引)

关于订单数量限制的另一个注意事项是——它提供了可怕的解释 语句,并可能以慢查询日志作为查询结束,而该查询不会 使用索引

最后一点是您的案例中的重要一点-将
ORDER BY
LIMIT
与一个大表(1.4m)和“不使用索引”(即使有索引!)结合在一起会导致非常缓慢的性能

编辑-根据评论:

对于这种特殊情况,您应该使用
按id从站点顺序中选择名称
,并在代码中将结果集拆分为50000个块

对于较大的
限值,这是“预期的”:

如果您需要,请注意使用索引进行排序是非常有效的 前几行,即使发生了一些额外的过滤,所以您需要 按索引扫描更多行,然后按限制请求。但是如果你 处理冲销效率高的限额查询将受到影响。 限制1000,10可能比限制0,10慢得多。这是真的 然而,大多数用户在搜索结果时不会超过10页 引擎机器人很可能会这样做。我见过机器人浏览200多页的网页 在我的项目中。对于许多未能解决这一问题的网站来说也是如此 提供启动DOS攻击的非常简单的任务–请求页面 从很少的连接中得到一些大的数字,这就足够了。如果你不 执行任何其他操作,确保阻止页面太大的请求 数字

对于某些情况,例如,如果结果是静态的,那么 预计算结果,以便查询位置。所以不是 查询限制为1000,10您的位置将在1000和1000之间 1009对于任何位置都具有相同的效率(只要是 索引)

关于订单数量限制的另一个注意事项是——它提供了可怕的解释 语句,并可能以慢查询日志作为查询结束,而该查询不会 使用索引

最后一点是您的案例中的重要一点-将
ORDER BY
LIMIT
与一个大表(1.4m)和“不使用索引”(即使有索引!)结合在一起会导致非常缓慢的性能

编辑-根据评论:

对于这种特殊情况,您应该使用
按id从站点顺序中选择名称
,并在代码中将结果集拆分为50000个块

你能试试这个吗:

SELECT name 
FROM site 
WHERE id >= ( SELECT id
              FROM site
              ORDER BY id
              LIMIT 50000, 1
            )
ORDER BY id
LIMIT 10 ;  
你能试试这个吗

SELECT name 
FROM site 
WHERE id >= ( SELECT id
              FROM site
              ORDER BY id
              LIMIT 50000, 1
            )
ORDER BY id
LIMIT 10 ;  

我是为sitemap做的,我在sitemap中列出了URL,通常我们不建议站点地图文件的URL超过50000个或文件大小为10mb。所以我订购了site1.xml 050000和site2.xml 500000100000。为了测试这一点,我使用了50000,10。但它并没有完成查询。我理解这一点,但正如我所写的:您使用的组合禁用了索引的使用。。。使用
ORDER BY
LIMIT
,但在您的情况下不能同时使用这两种方法。。。请看我上面的编辑…谢谢你的努力。我先尝试一下,然后让你知道结果。谢谢你的努力,最后我得到了服务器的一些响应。正如您所说,我使用了类似“从站点限制5000050000中选择名称”这样的查询;现在我看到记录被列出。但有时我看到记录id 10被插入到记录id 9或8之前。这就是为什么我在选择时点了菜。除了我上面所说的,不按顺序使用还有其他缺点吗?我不明白。。。使用
ORDER BY
和NOT
LIMIT
并在代码中拆分结果集(不在SQL中)-这样使用索引,性能良好,结果基本相同…我正在为sitemap执行此操作,我在sitemap中列出了URL,通常我们不建议站点地图文件的URL超过50000个或文件大小不超过10mb。所以我订购了site1.xml 050000和site2.xml 500000100000。为了测试这一点,我使用了50000,10。但它并没有完成查询。我理解这一点,但正如我所写的:您使用的组合禁用了索引的使用。。。使用
ORDER BY
LIMIT
,但在您的情况下不能同时使用这两种方法。。。见我的编辑上面…谢谢你的努力,我给一个尝试f