2015-11-28 51 views
0

我想問一個關於我正在設計的數據庫的問題。我有一張存儲所有用戶信息的表格,包含12列,包括電子郵件和密碼字段。我想讓這張表有效地搜索。我正在尋找這樣做的多個選項。如何讓用戶表最容易在MySQL中搜索?

  1. 讓用戶表對電子郵件值 一個主鍵我只是有一個電子郵件值一個表,因此,如果郵件被改變,我不擔心更新一堆表。

  2. 讓用戶表中同時擁有這是自動遞增的用戶ID主鍵,在郵件 我需要把一個鍵上的電子郵件的關鍵,因爲當他們的用戶他們的電子郵件用戶登錄。

  3. 有一個單獨的「註冊」表,其中包含電子郵件和自動遞增的用戶ID索引。 然後,我可以將此表連接到使用用戶ID作爲外鍵的用戶值表。

如果有大量用戶,這些選項中哪一個最有效? (> 100,000)我想從一開始就設計它,這樣一旦發現性能問題,我就不必重新設計。我的直覺說,只有這兩個值纔有第三個表「註冊」將是最有效的,所以在查找大量用戶數據時,我不必使用字符串比較。但我不是100%肯定的。

我看過其他問題,並沒有得到一個明確的答案,我的類型的情況。我考慮了我找到的選項,並綜合了我對上述每種類型的想法。

+0

你能發佈你有的表的佈局嗎?我懷疑你的桌子可以使用很好的標準化,但細節取決於出發點。 –

回答

0

只有12個表格(假設相關列)並不突出顯示爲自動化的歸一化候選項。如果你過度規範化,由於性能問題和過於複雜的查詢,你將不得不撤消你的工作。關係數據庫的要點是在同一個表中有類似的信息,這樣你就不必在每個查詢上都有JOIN

將索引添加到正在搜索的任何列(當然在您的'email'列中!)是優化表上WHERE子句性能的第一條路線。現代數據庫標準認爲100,000個行不被認爲是大的。

如果在所有頻繁掃描的列上添加索引後,仍然希望獲得更多性能,則應考慮其他優化更多地與數據庫引擎相關。例如,使用帶有ROW_FORMAT = FIXED的MyISAM表格格式可以比InnoDB提供顯着的改進。先決條件是不使用任何可變長度的字段(CHAR()而不是VARCHAR()),並且該表將被讀取得比插入或刪除更多(因爲後面的選項使用表級鎖定而不是基於MyISAM的表中的行級鎖定)。但是用戶信息表不可能經常被刪除或插入(與讀取/選擇的次數相比),並且固定的最多100或200個字符可以容易地用於名稱/電子郵件/地址/等。領域,所以它可能是一個很好的候選人。這是一個article,顯示這個改變加快了44%。

只有在完成所有這些步驟之後,您纔會考慮過規範化或表分區或其他此類方案。