2016-08-25 95 views
2

简而言之,我知道Indexes最适用于Where子句中经常使用的列,以及任何类型的排序,比如“order由“,并与高基数cols。另一方面,如果过度使用,索引会减慢写操作,并且会占用磁盘空间。MYSQL InnoDB引擎索引(B-Tree)和一对一的关系

我有以下字段的用户登记表:

  ID INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, 
      User_name VARCHAR(35) NOT NULL, 
      BirthDay DATE NOT NULL, 
      password CHAR(70) NOT NULL, 
      Security_hint VARCHAR(27) NOT NULL, 
      Email VARCHAR(225) NOT NULL, 
      userType ENUM ('a','b','c','d') NOT NULL DEFAULT 'a', 
      Signup_Date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
      activation TINYINT(1) UNSIGNED NOT NULL, 
      Ip BINARY(16) NOT NULL, 
      PRIMARY KEY (ID), 
      UNIQUE KEY User_name (User_name,Email) 
  1. 我很确信与我所选择的所有字段的数据类型。
  2. 字段Signup_DateSecurity_hint很少会被查询,所以我决定在一个单独的表中隔离它们并使用外键使用1-1关系。这个策略是否有效?这种策略可能导致性能下降吗?
  3. 重要的一点:我是否还需要为PASSWORD字段编制索引以便使登录过程非常快速?

非常感谢你们提前。

编辑:我的登录查询是SELECT columns FROM users WHERE username = "x" AND password = "stuff"。我使用的指数电子邮件只是为了让现有的电子邮件快速的检查,如电子邮件和用户名必须为每个用户

+1

你应该只问一个问题,因为它可以更容易地回答。通过一次回答两个问题,你可以完全回答第一个答案,而其他人对第二个问题有最好的答案 - >哪一个答案应该被接受? – Philipp

+0

@菲利普。如果这两个问题的答案很好,如果只有一个问题需要回答,我希望它是重要的一个。谢谢 – Tim

回答

0

AD 1:电子邮件通常定义为VARCHAR(255),而不是225.您将密码存储为CHAR(70) - 我假设您使用了一些散列,它将返回完全70个字节,否则应该使用VARCHAR。

AD 2:1对1关系一般表现不佳,因为您必须运行JOIN。我认为唯一的情况是将原始表的一部分写入HEAVILY中,以1对1关系来分隔数据。在这种情况下,您可以分隔这部分,以便您不必一直重建其他列上的索引。

AD 3:我想你使用这样的:

SELECT * 
FROM users 
WHERE username = "myname" AND password = sha256("mypass") AND activation = 1 

在这种情况下,所有搜索的列具有索引:username, password, activation

AD唯一密钥:UNIQUE KEY User_name (User_name,Email)意味着您可以拥有更多具有相同user_name和不同电子邮件的用户,反之亦然。您应该使用2个独立的唯一键来使所有的用户名和电子邮件唯一。

1

领域Signup_Date和Security_hint很少会针对查询独一无二的,所以我决定来隔离他们在一个单独的表中并使用外键使用1-1关系。这个策略是否有效?这种策略可能导致性能下降吗?

我没有看到这样处理它的价值。如果它不以关键的方式影响你的表的大小,你只需要添加不必要的连接。

重要的一点:我是否还需要为PASSWORD字段建立索引以便使登录过程非常快速?

取决于您的登录。

如果您使用的是这样的:

SELECT columns FROM users WHERE username = "x" AND email ="y" AND password = "stuff" 

你会被罚款,因为indexusername + emailunique-constraint采取由index使用查找用户的关怀。

如果你只检查您的登录用户名和密码,在(用户名,密码)的指数可能是有意义IF你认为会有用户的很多使用相同的用户名。否则,它将使用用户名的索引,并且通常也会很快。

+0

是的,我的最后一段处理这种情况。您不需要登录的其他索引 – Philipp