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

时间:2009-11-21 03:04:14

标签: mysql limit

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

E.g。

SELECT name FROM users WHERE userid = 4

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

2 个答案:

答案 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条款

如果没有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是一种保守使用的工具,而不是您首先要做的事情 - 知道何时使用聚合和/或分析函数。