我正在查询mySQL数据库以从1个特定行检索数据。我正在使用表主键作为WHERE约束参数。
E.g。
SELECT name FROM users WHERE userid = 4
userid列是表的主键。在mySQL语句的末尾使用LIMIT 1是一种好习惯吗?或者有任何速度优势吗?
答案 0 :(得分:24)
我认为这是一种不好的做法,因为它涉及像userid
这样的东西,它通常是独一无二的,你不会有多个。因此,LIMIT 1
似乎相当矛盾,而后来维护代码的人可能不得不猜测你的设计。
另外,我认为它没有任何速度优势。您可以查看mySQL的Explain以获取分析查询的简单工具。
注意,如评论中所述。 LIMIT #
确实在其他情况下具有速度和一般好处,而不是这一点。
答案 1 :(得分:13)
userid列是表的主键。在mySQL语句的末尾使用LIMIT 1是一种好习惯吗?或者有任何速度优势吗?
在示例末尾使用LIMIT 1
不是一个好习惯 - 完全没必要,因为userid列是主键。主键表示表中只有一行/记录具有该值,只返回一行/记录。
但最终的指标是解释计划:
explain SELECT t.name FROM USERS t WHERE t.userid = 4
...返回:
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
-----------------------------------------------------------------------------------------------------
1 | SIMPLE | users | const | PRIMARY | PRIMARY | 4 | const | 1 |
...和
explain SELECT t.name FROM USERS t WHERE t.userid = 4 LIMIT 1
...返回:
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
-----------------------------------------------------------------------------------------------------
1 | SIMPLE | users | const | PRIMARY | PRIMARY | 4 | const | 1 |
没有区别,没有必要。在这种情况下,它似乎已经过优化(仅针对主键进行搜索)。
如果没有LIMIT
,使用ORDER BY
将返回任意行/记录(如果返回多个行/记录)。例如,使用“John Smith”场景,其中2人以上可以命名为“John Smith”:
SELECT t.userid
FROM USERS t
WHERE t.first_name = 'John'
AND t.last_name = 'Smith'
LIMIT 1
...有可能返回任何可能的userid
值,其中名字是“John”,姓氏是“Smith”。不能保证始终返回相同的值,并且每次获得不同值的可能性随着可能记录的数量而增加。
我个人不关心LIMIT的使用。 Oracle,SQL Server或DB2不支持该语法 - 使查询的可移植性降低。 LIMIT是一种保守使用的工具,而不是您首先要做的事情 - 知道何时使用聚合和/或分析函数。