对于WHERE条件基于PK的查询,建议使用"LIMIT 1"吗?

jus*_*inl 22 mysql limit

我正在查询mySQL数据库以从1个特定行检索数据.我正在使用表主键作为WHERE约束参数.

例如

SELECT name FROM users WHERE userid = 4
Run Code Online (Sandbox Code Playgroud)

userid列是表的主键.在mySQL语句的末尾使用LIMIT 1是一种好习惯吗?或者有速度优势吗?

Bar*_*tek 24

我认为这是一种不好的做法,因为当它涉及到userid它通常是独一无二的东西时,你不会有多个.因此,LIMIT 1看起来相当矛盾,而后来维护代码的人可能不得不猜测你的设计.

此外,我认为它没有任何速度优势.您可以查看mySQL的Explain,了解分析查询的简单工具.

请注意,如评论中所述.LIMIT #在其他情况下确实有速度和一般好处,而不是这个.


OMG*_*ies 13

userid列是表的主键.在mySQL语句的末尾使用LIMIT 1是一种好习惯吗?或者有速度优势吗?

LIMIT 1在示例的最后使用是不好的做法- 这完全没必要,因为userid列是主键.主键表示表中只有一行/记录具有该值,只返回一行/记录.

但最终的指标是解释计划:

explain SELECT t.name FROM USERS t WHERE t.userid = 4
Run Code Online (Sandbox Code Playgroud)

...的回报:

id  | select_type | table   | type  | possible_keys  | key      | key_len  |  ref  |  rows  |  Extra
-----------------------------------------------------------------------------------------------------
1   | SIMPLE      | users   | const | PRIMARY        | PRIMARY  | 4        | const | 1      |
Run Code Online (Sandbox Code Playgroud)

...和:

explain SELECT t.name FROM USERS t WHERE t.userid = 4 LIMIT 1
Run Code Online (Sandbox Code Playgroud)

...的回报:

id  | select_type | table   | type  | possible_keys  | key      | key_len  |  ref  |  rows  |  Extra
-----------------------------------------------------------------------------------------------------
1   | SIMPLE      | users   | const | PRIMARY        | PRIMARY  | 4        | const | 1      |
Run Code Online (Sandbox Code Playgroud)

结论

没有区别,没有必要.在这种情况下似乎已经优化(仅针对主键进行搜索).

LIMIT条款

如果返回多个行,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
Run Code Online (Sandbox Code Playgroud)

......冒着返回userid名字为"John"且姓氏为"Smith"的任何可能值的风险.不能保证始终返回相同的值,并且每次获得不同值的可能性随可能记录的数量而增加.

我个人不关心LIMIT的使用.Oracle,SQL Server或DB2不支持该语法 - 使查询的可移植性降低.LIMIT是一种保守使用的工具,而不是您要达到的第一件事 - 知道何时使用聚合和/或分析功能.