代码之家  ›  专栏  ›  技术社区  ›  nickf

按唯一字段搜索时使用限制

  •  2
  • nickf  · 技术社区  · 16 年前

    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

    here ,这可能也有帮助。

    3 回复  |  直到 7 年前
        1
  •  3
  •   JR Lawhorne    16 年前

    没有必要使用限制。

    然而如果您在表上有一个巨大的巨大基数(并且您担心速度),那么您可能会考虑不使用DB中的特殊唯一约束并从应用程序管理它。然后,您可以仅在用户名字段的前几个字符上指定索引。这将大大减少索引的大小,确保整个内容适合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))
    );
    

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

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

        2
  •  2
  •   Darryl Hein IrishChieftain    16 年前

    我一直被告知并读到你应该包括 LIMIT

        3
  •  1
  •   Mike Thompson    16 年前

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