【问题标题】:What should I be indexing? Usernames or User IDs?我应该索引什么?用户名还是用户 ID?
【发布时间】:2011-06-03 02:31:07
【问题描述】:

我有一个相当简单的表(原谅错误/愚蠢,我还在学习。为 MySQL 编写)

CREATE TABLE IF NOT EXISTS  `userdata` (
    `userid`    UNSIGNED int(18446744073709551615) AUTO_INCREMENT, 
    `username`  char(255) NOT NULL,
    `password`  char(255) NOT NULL,
    `salt`      char(255) NOT NULL,
    `email`     char(255) NOT NULL,

    PRIMARY KEY(`userid`)
);

我了解到添加索引可以提高查询的性能,因为它不需要查看整个数据库。相反,它会查看索引并匹配数据(如果我错了,请纠正我)。

我已经找到了足够好的索引创建方法,但不是我应该索引的内容。
我应该在用户名上有我的索引吗?电子邮件地址、用户 ID 或我尚未添加的某些字段?

【问题讨论】:

  • 这取决于您在表上运行的查询类型。例如,您会按名称或 ID 或两者搜索吗?
  • 最有可能通过名称进行搜索(例如此处的搜索工具,或在论坛上找到的工具),以及内部 ID。不过,我愿意使用最快的。

标签: mysql sql indexing create-table


【解决方案1】:

要考虑的主要是该字段是否经常用于通过记录搜索和过滤。如果是,请将其编入索引。其他答案很好地解决了这个问题。

但是,请记住,索引会增加一些开销来插入和更新操作。如果一个字段不断更新,但很少在搜索子句中使用,您可能会失望地发现索引实际上是在减慢您的速度而不是提高性能。

【讨论】:

    【解决方案2】:

    您应该只根据您对列的实际使用情况创建索引

    WHERE中的用法:
    如果您从来没有WHERE username='xyz',则不需要索引
    如果你有很多,那么添加一个索引

    JOIN中的用法:
    如果您从来没有任何JOIN xxxx ON x.userid=u.userid,则不需要索引
    如果你有很多,那么添加一个索引

    【讨论】:

    • 那么,如果我将我的 userid 字段设置为主键,手动索引它是没用的?
    • 我无法快速找到解释它的文章的链接,但这可能会有所帮助:databasejournal.com/features/mysql/article.php/1382791/…
    • @亚历山大。是的,它很可能是多余的,因为数据库无论如何都需要对其进行索引以有效地检查没有重复的 pks
    【解决方案3】:

    您应该在几乎所有要进行键控查找的列上都有一个索引。在您的一个查询中,有什么事情要做where userid = ? 吗?然后索引userid。你会在username 上进行查找吗?然后索引用户名。 password 呢?可能不会,所以不要打扰。

    【讨论】:

    • 主键已经自动获得“索引”。只需将列类型设为“串行”即可。
    【解决方案4】:

    您将搜索哪些字段?这些应该是您的第一批索引候选人。还索引将成为其他表中外键的任何列(userid 似乎是一个可能的候选者)。

    【讨论】:

    • 与用户搜索相关的任何字段(不包括密码和盐)。
    【解决方案5】:

    Primay ID 应该转到用户 ID。 从现在和长远来看,它都非常有帮助。

    【讨论】:

      猜你喜欢
      • 2010-09-05
      • 2019-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      • 2011-01-16
      相关资源
      最近更新 更多