2016-08-25 94 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