2014-01-12 60 views
0

可以說我有用戶表:
| id |用戶名|電子郵件|地址|
避免JOIN提高性能?

而且帖子表:
| id |後| | user_id |日期|

當我想顯示帖子時,每次我需要去用戶表來從user_id檢索用戶名。我想避免使用JOIN進行簡單數據檢索,因此我所做的是在帖子表中添加另一個顏色:
| id |後| | user_id |用戶名|日期|

這樣我就不必使用JOIN中檢索用戶名會顯示在帖子

你認爲這是更好?

+0

沒有理由,以避免簡單的內部連接。如果你在'user_id'上放置一個外鍵索引,那麼連接就不會有明顯的性能影響。 Mysql是爲這種事情而構建的。 – miyasudokoro

+0

多個(3-4)連接的表現如何? – DeepBlue

+0

如果它們都是索引連接,那麼不會,幾乎沒有性能影響。 – miyasudokoro

回答

1

沒有。您的替代結構很容易出現不一致(例如,如果用戶更改了他的名字;請閱讀第三種標準表格http://en.wikipedia.org/wiki/Third_normal_form#.22Nothing_but_the_key.22) 爲什麼不想使用JOIN?你有沒有設置適當的索引?

+0

我不想使用連接,因爲我需要每一點改進的性能。我知道查詢會運行很多次。 – DeepBlue

+0

你認爲使用JOIN和索引不會很慢嗎? – DeepBlue

+0

請參閱上面的spsc_tech評論。您還可以查看當前的query_cache配置以提高性能。 http://dev.mysql.com/doc/refman/5.1/en/query-cache.html –

0

我認爲這取決於設計和未來,NIY我會建議你不要做:
雖然從目前的尊重,你會認爲這將是更好的性能,以避免加入,但如果你的應用擴展一下,並且使用這種非標準化的表結構並不好。

例如,如果其中一個海報更改了用戶名,那麼您如何實現這一點?更新整個表格?如果您的數據可能會超過1000萬個元組,那麼將會很困難,因爲update會在更新過程中鎖定表。
因此我不會推薦這個。

如果您的應用程序需要頻繁更新,那麼可以忽略聯接性能。

+0

是的計劃是更新表。不過,我同意你,它需要更新大型表,我的妥協是假設這不會經常發生(不像每個職位retreiving用戶名) – DeepBlue

0

如果[users]表中的[id]是主鍵,我認爲使用JOIN已經足夠好了。

另外,如果你選擇的posts數量有限,如10個職位,也可以嘗試這個SQL:

select id, post, user_id, 
    (select username from users where id = user_id) as username, date 
from posts 
limit 0, 10