在通过唯一字段搜索时使用LIMIT

时间:2008-10-10 03:44:15

标签: sql indexing

给出这样的表结构:

CREATE TABLE `user` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `name` varchar(32) NOT NULL,
  `username` varchar(16) NOT NULL,
  `password` char(32) NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `username` (`username`)
);

在按用户名搜索时使用LIMIT关键字是否有用,或者DB是否足够聪明,知道只能有一个结果,因此一旦找到结果就停止搜索?

SELECT * FROM `user` WHERE `username` = 'nick';

-- vs --

SELECT * FROM `user` WHERE `username` = 'nick' LIMIT 1;

更新:感谢您的回答,他们一直很有启发性。似乎,即使没有必要,将LIMIT 1放在查询上也不会有害,并且可能会提高可读性(您不必查看数据库模式就知道只返回一个)。对于JR的回答特别呐喊 - 我甚至不知道你能用指数做到这一点。

此外,我发现here也有类似的问题,这也可能有所帮助。

3 个答案:

答案 0 :(得分:3)

无需使用LIMIT。

然而......如果你在桌面上有一个巨大的巨大基数(并且你担心速度),你可能会考虑不在数据库中使用特殊的UNIQUE约束并从你的应用程序中管理它。然后,您只能在用户名字段的前几个字符上指定INDEX。这将大大减少索引的大小,确保整个内容适合RAM,并可能加快查询速度。

所以,你可以试试:

CREATE TABLE `user` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `name` varchar(32) NOT NULL,
  `username` varchar(16) NOT NULL,
  `password` char(32) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `username` (`username`(4))
);
如果你的第一次尝试太慢,可以选择

。这意味着,当然,您必须在插入之前检查重复的用户名,但无论如何您可能必须这样做以告诉用户他们必须选择另一个用户名。

根据您使用的数据库服务器和引擎,为所有字符串指定固定宽度字段也可能更快。而不是 varchar ,请使用 char

答案 1 :(得分:2)

我总是被告知并且每次只想要1个结果时都应该包括LIMIT。这只是告诉DB它应该停止这么重要。在你的情况下,你可能是对的,它没有什么区别,但我认为总是比你总是做的更好,而不是总是在你需要的时候决定并把它留出来。

答案 2 :(得分:1)

sql查询优化器应该足够聪明,可以解决这个问题。