5

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

4

5 回答 5

6

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

于 2011-01-03T22:31:54.580 回答
5

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

在WHERE中的用法:
如果你从来没有, 如果你有很多这些,则WHERE username='xyz'不需要索引,然后添加一个索引

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

于 2011-01-03T22:36:13.187 回答
3

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

于 2011-01-03T22:31:50.717 回答
0

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

于 2011-01-03T22:31:45.603 回答
0

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

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

于 2021-03-05T11:43:39.090 回答