Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 我应该做什么?用户名还是用户ID?_Mysql_Sql_Indexing_Create Table - Fatal编程技术网

Mysql 我应该做什么?用户名还是用户ID?

Mysql 我应该做什么?用户名还是用户ID?,mysql,sql,indexing,create-table,Mysql,Sql,Indexing,Create Table,我有一个相当简单的表(请原谅错误/愚蠢,我还在学习。为MySQL编写): 我已经读到添加索引可以提高查询的性能,因为它不需要查看整个数据库。相反,它将查看索引并匹配数据(如果我错了,请纠正我) 我已经找到了如何创建索引的方法,但没有找到应该索引的内容。 我应该有用户名索引吗?电子邮件地址、用户ID或我尚未添加的某些字段?主要ID应转到用户ID。 无论从现在还是从长远来看,它都非常有用。您将搜索哪些字段?这些应该是索引的第一个候选对象。还可以索引将成为其他表中外键的任何列(userid似乎是一个可

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

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

我已经找到了如何创建索引的方法,但没有找到应该索引的内容。

我应该有用户名索引吗?电子邮件地址、用户ID或我尚未添加的某些字段?

主要ID应转到用户ID。
无论从现在还是从长远来看,它都非常有用。

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

您应该在正在进行键控查找的几乎所有列上都有一个索引。在您的一个查询中,是否有什么东西将执行
where userid=?
?然后在
userid
上建立索引。您是否要查找
用户名
?然后在用户名上建立索引。关于
密码
呢?可能不会,所以不用麻烦了。

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

中的用法,其中
如果您从未使用过
其中username='xyz'
,则不需要索引
如果有很多这样的索引,那么添加一个索引

在加入中的用法:
如果您从未在x.userid=u.userid上加入过xxxx,则不需要索引

如果你有很多这些,那么添加一个索引

,要考虑的主要问题是这个字段是否经常用于记录的<强>搜索和过滤< /强>。如果是,索引它。其他答案很好地解决了这个问题


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

这取决于您在表上运行的查询类型。例如,您会按名称或ID或两者进行搜索吗?最有可能的搜索方式是按名称(如此处的搜索工具或论坛上的搜索工具)和内部ID。不过,我愿意使用最快的方法。因此,如果我将我的userid字段设置为主键,手动为其编制索引是没有用的?我无法快速找到一篇文章的链接来解释它,但这可能会有所帮助:@Alexander。是的,它很可能是多余的,因为db无论如何都需要对其进行索引,以有效地检查是否存在与用户搜索相关的重复pksAny字段(不包括密码和salt)。主键已自动获得“索引”。只需将列类型设置为“serial”就可以了。
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`)
);