mysql按查询排序问题
我在mysql中使用order by时遇到了一些问题。我有一个名为“site”的表,有3个字段,如id、name、rank。该表包含约140万条记录。当我像这样应用查询时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
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
和NOTLIMIT
并在代码中拆分结果集(不在SQL中)-这样使用索引,性能良好,结果基本相同…我正在为sitemap执行此操作,我在sitemap中列出了URL,通常我们不建议站点地图文件的URL超过50000个或文件大小不超过10mb。所以我订购了site1.xml 050000和site2.xml 500000100000。为了测试这一点,我使用了50000,10。但它并没有完成查询。我理解这一点,但正如我所写的:您使用的组合禁用了索引的使用。。。使用ORDER BY
或LIMIT
,但在您的情况下不能同时使用这两种方法。。。见我的编辑上面…谢谢你的努力,我给一个尝试f