2

给定这样的表结构:

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 关键字有什么用,还是数据库足够聪明,知道可能只有一个结果,因此一旦找到就停止搜索?

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

-- vs --

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

更新:感谢您的回答,他们一直很有启发性。看起来,即使没有必要,LIMIT 1进行查询也不会受到伤害,并且可能会增加可读性(您不必查看数据库模式就知道只会返回一个)。特别为 JR 的回答大喊大叫——我什至不知道你可以用索引来做到这一点。

另外,我在这里找到了一个类似的问题,这也可能有所帮助。

4

3 回答 3

3

没有必要使用 LIMIT。

但是...如果您的表上有一个 HUGE HUGE HUGE 基数(并且您担心速度),您可能会考虑不在数据库中使用特殊的 UNIQUE 约束并从您的应用程序中对其进行管理。然后,您可以仅在用户名字段的前几个字符上指定一个索引。这将大大减少索引的大小,确保整个索引都适合 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

于 2008-10-10T03:57:50.030 回答
2

我一直被告知并阅读过,LIMIT每次您只需要 1 个结果时,您都应该包括在内。这只是告诉数据库无论如何它都应该停止。在您的情况下,您可能是对的,这并没有什么不同,但我认为总是做总比总是在需要时决定并忽略它要好。

于 2008-10-10T03:55:25.137 回答
1

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

于 2008-10-10T03:50:30.230 回答