我不是 DBA 部落的血统成员,而是更多的开发部落,我发现自己试图找出一些运行缓慢的查询。
然而,我的问题不是“为什么我的查询很慢”,而是想知道 MySql 中的“LIMIT”命令是如何工作的。
目前,我仍在尝试对服务器性能本身进行故障排除,因此作为一种给它一点 SQL 来咀嚼的方式(只是为了让它做一些工作),我正在使用以下内容:
SELECT * FROM <table> LIMIT 10
我正在使用的表是一个活表,其中有超过 5000 万行,因为我目前只进行测试,所以我的期望是这将返回表顶部的前 10 条记录,并且很容易在 10 分钟内完成。
然而...
我看到这个 SQL 在 30 分钟或更长时间后仍在运行,并且似乎什么也没做。
我想具体澄清的是:
MySql 是否尝试从数据库中获取整个表,然后才返回前 10 行
或者
MySql 是否在接收到行时获取行并在它计数收到 10 行后停止
干杯肖蒂
mysql 应该像您的示例一样优化查询,而不是仅仅为了检索 10 条记录而进行全表扫描。在执行全表扫描之前添加
order by
不带索引的。limit 10
您确定您的“表格”真的是表格而不是视图吗?您可能正在从缓慢的视图中进行选择。
如果查询没有任何特定的排序,它会返回它收到的前 10 行。但如果有“
WHERE ...
”或“ORDER BY ...
”子句,则必须先获取完整的结果集,然后再获取前 10 行。如果
SELECT...
没有“WHERE ...
”或“ORDER BY ...
”子句的简单“”需要那么长时间,我可能会建议分析表http://dev.mysql.com/doc/refman/5.0/en/analyze-table.html。您还应该检查此数据库表是否具有主键。如果没有,设置一个可能会加快查询速度。我应该早点回答这个问题,但它让我忘记了,所以为此道歉。
好的,我想给大家一个答案,因为有一些很好的答案,alexanderos 给出了我所说的实际答案,它澄清了 limit 本身是如何实际工作的。
速度变慢的实际原因是服务器问题,以至于云提供商设置不正确,实际上并没有发挥应有的作用。
我现在怎么把那个项目抛在了后面,但是我在这个过程中学到了一些关于如何处理行为不端的服务器的好东西。
所以感谢大家的投入,我将亚历山大的回答标记为最合适的。
肖蒂