2010-04-20 40 views
0

我有類似如下的表結構:可伸縮的方式與許多加入了許多表

user 
    id 
    name 

profile_stat 
    id 
    name 

profile_stat_value 
    id 
    name 

user_profile 
    user_id 
    profile_stat_id 
    profile_stat_value_id 

我的問題是:

如何評估一個查詢,我想找到所有有多個統計信息的用戶有profile_stat_id和profile_stat_value_id?

我試過做一個內部自我加入,但是當搜索許多統計信息時,它很快就會變得瘋狂。我也試着對實際的user_profile表進行計數,這樣會更好,但仍然很慢。

有一些神奇的我失蹤?我在user_profile表中有大約1000萬行,並且希望查詢不超過幾秒鐘。那可能嗎?

回答

0

通常數據庫能夠以一個體面的方式來處理一千萬條記錄。在大量數據的專業環境中(大約3000萬到4000萬行),我主要使用oracle,甚至在表上執行連接查詢從未花費超過一秒或兩秒的時間運行。

關於重要lessson我認識到,只要查詢性能不好就要查看索引是否在連接字段上正確定義。例如。這裏有profile_stat_id和profile_stat_value_id(我假設是主鍵的user_id)索引應該定義索引。如果你沒有這樣做,這肯定會給你一個很好的性能提升。 在定義索引後,運行查詢一次或兩次以使DB有機會在驗證增益之前計算索引樹和查詢計劃

0

表面上看來,您似乎要求這樣做,其中不包含自連接:

SELECT u.name, u.id, s.name, s.id, v.name, v.id 
    FROM User_Profile  AS p 
    JOIN User    AS u ON u.id = p.user_id 
    JOIN Profile_Stat  AS s ON s.id = p.profile_stat_id 
    JOIN Profile_Stat_Value AS v ON v.id = p.profile_stat_value_id 

如果相應的表不需要有匹配的條目,則可以將列出的任何連接更改爲LEFT OUTER JOIN。所有這些都是將中央User_Profile表與其他三個表中的每個表連接在適當的連接列上。

如果你認爲你需要自加入?

[我沒有包括任何東西來過濾'多個統計';我對這個問題的部分意味着什麼並不清楚。]