【问题标题】:Using LIMIT when searching by a unique field按唯一字段搜索时使用 LIMIT
【发布时间】:2010-09-16 10:40:58
【问题描述】:

给定这样的表结构:

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 的回答大喊大叫——我什至不知道你可以用索引来做到这一点。

另外,我发现了一个类似的问题here,这可能也有帮助。

【问题讨论】:

    标签: sql indexing


    【解决方案1】:

    没有必要使用 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))
    );
    

    如果您的第一次尝试太慢,则作为替代方案。这意味着,当然,您必须在插入之前检查重复的用户名,但无论如何您可能都必须这样做以告诉用户他们必须选择另一个用户名。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • :-D “应该”很好,但不是答案
        猜你喜欢
        • 1970-01-01
        • 2017-09-13
        • 2011-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多