我应该索引什么?用户名或用户ID?

时间:2011-01-03 22:28:29

标签: mysql sql indexing create-table

我有一个相当简单的表(原谅错误/愚蠢,我还在学习。为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或我尚未添加的某个字段?

5 个答案:

答案 0 :(得分:6)

您应该在几乎任何要进行键控查找的列上都有索引。在您的某个查询中,某些事情会发生where userid = ?吗?然后在userid上编制索引。你打算在username上进行查找吗?然后索引用户名。在password上怎么样?可能不是,所以不要打扰。

答案 1 :(得分:4)

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

WHERE 中的用法:
如果您从未拥有WHERE username='xyz',则需要无索引 如果你有很多这些,那么添加一个索引

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

答案 2 :(得分:2)

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

答案 3 :(得分:0)

主要ID应转到用户ID。 从现在到现在,它都非常有用。

答案 4 :(得分:0)

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

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