2010-05-13 48 views
2

我正在設計一套Web應用程序來跟蹤科學實驗室數據。每個實驗室都有幾個成員,每個成員都可以訪問他們自己的數據以及整個實驗室的數據。因此,許多典型的查詢將會返回多個成員的記錄(例如,我的鼠標,喬的鼠標和莎莉的鼠標)。商業Web應用程序 - 可擴展的數據庫設計

我想我已經很好地規範了數據庫。我現在想知道如何確保用戶能夠有效地訪問他們自己的數據和他們實驗室的數據集,當它們混合(希望)來自其他實驗室的大量記錄時。

到目前爲止我所提出的是,大多數表格將以兩個字段結束:user_id和labgroup_id。任何SELECT語句的WHERE子句將包含對其中一個id字段(「... WHERE'labroup_id = n ...」或「... WHERE user_id = n ...」)的適當引用。

我的問題是:

  1. 這是一種方法,將擴展到10^6個或更多的記錄?

  2. 如果是這樣,在查詢中使用這些字段的最佳方式是什麼,以便最有效地搜索數據庫的相關子集?例如查詢的第一步應該是創建一個僅包含實驗室組數據的臨時表嗎?或者使用id,user_id和labroup_id字段的某種組合進行索引就足夠了?

我非常感謝任何反應者。

+0

mysql已經內置了一個查詢優化器。你也在使用白皮書(索引),所以它不應該是一個問題。 – Ben 2010-05-13 16:31:09

+0

@Ben:與例如MS SQL,MySQL不會建議您應該創建以提高性能的索引。瞭解MySQL如何使用主鍵和索引以及如何使用可用的性能度量工具來確保高性能是非常重要的。 – 2010-05-13 17:25:53

回答

3

你應該比10^6行更好地使用這種方法。我們目前使用的東西非常相似,混合客戶數據的區別在於具有10^8行的帳戶ID,並且在適度的硬件上根本沒有性能問題。

確保您定義的索引覆蓋了user_id和labgroup_id。

請記住,MySQL每個查詢只能使用一個密鑰。看看你的典型查詢模式。如果人們將在where子句中使用多個列,那麼要構建包含大量使用的列的複合鍵,這些列也提供了很好的區別(意思是幫助縮小行數)。yes/no列是一個不好的關鍵,但是具有許多不同值的列經常在where子句中使用,可能是一個很好的候選人)。

啓用MySQL慢查詢日誌(或獲取商業查詢分析器或30天試用版)並查看哪些查詢需要很長時間。使用EXPLAIN命令找出正在使用的索引和方式。如果一個特定的查詢頻繁出現在慢速查詢日誌中和/或執行時間很長,請考慮修改您的索引或添加一個新的索引。

確保您的my.cnf適合您的環境。開箱即用的配置幾乎總是很差。這是一個good guide

+0

真棒 - 非常感謝! – 2010-05-13 16:42:12

+0

@Rob:還有一件事... MySQL可以使用從左到右的複合索引的部分,例如如果人們通常使用labgroup_id查詢,但有時也使用另一列(例如在此處製作一個)experiment_id查詢,則應該創建一個複合索引labgroup_id + experiment_id。當他們在WHERE子句中只有labgroup_id時,MySQL可以使用複合索引。另一方面,如果where子句只使用沒有labgroup_id的experiment_id(它可以從左到右讀取複合鍵),則MySQL不能使用該索引。 – 2010-05-13 17:29:26