gpt4 book ai didi

mysql - 第一次匹配后停止 MySQL

转载 作者:可可西里 更新时间:2023-11-01 07:39:51 25 4
gpt4 key购买 nike

我注意到在查询末尾添加 LIMIT 1 不会减少执行时间。我有几千条记录和一个简单的查询。如何让 MySQL 在第一次匹配后停止?

例如,这两个查询都需要大约半秒:

SELECT id,content FROM links WHERE LENGTH(content)<500 ORDER BY likes

SELECT id,content FROM links WHERE LENGTH(content)<500 ORDER BY likes LIMIT 1

编辑:这是解释结果:

id | select_type | table | type possible_keys | key | key_len | ref | rows | Extra
1 | SIMPLE | links | ALL | NULL | NULL | NULL | NULL | 38556 | Using where; Using filesort

最佳答案

两个查询运行时间的差异取决于实际数据。

有几种可能的情况:

LENGTH(content)<500 有很多记录

在这种情况下,MySQL 将开始扫描所有表行(根据主键顺序,因为您没有提供任何 ORDER BY)。没有索引使用,因为您的 WHERE 条件无法被索引。由于 LENGTH(content)<500 的行比较多,LIMIT 查询将比另一个查询返回得更快。

没有LENGTH(content)<500的记录同样,MySQL 将开始扫描所有表行,但必须遍历所有记录以找出不满足条件的记录。出于同样的原因,也不能使用索引。在这种情况下 - 两个查询将具有完全相同的运行时间。

这两种情况之间的任何情况都会有不同的运行时间,随着表中有更多有效记录,运行时间会相差更远。

编辑现在您添加了 ORDER BY,答案有点不同:

  • 如果 likes 列上有索引,ORDER BY 将使用它,时间将是到达满足 WHERE 条件的第一条记录所需的时间(如果 66% 的记录满足,则这应该比没有 LIMIT 更快)。

  • 如果 likes 列上没有索引,则 ORDER BY 将占用大部分时间 - MySQL 必须扫描所有表以获取所有满足 WHERE 的记录,然后按 likes 对它们进行排序,然后取第一个一。在这种情况下,两个查询将具有相似的运行时间(扫描和排序结果比返回 1 条记录或多条记录要长得多...)!

关于mysql - 第一次匹配后停止 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22305110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com