2012-10-12 34 views
-1

有活動。活動可以是私人的 - 只有被邀請的用戶才能看到它的,公開的 - 所有人都可以看到 - 只有羣組成員才能看到它。團體可以是公共或私人的。我們不應該顯示私人團體的活動。如何使用隱私設置選擇數據?

event 
id, title, group (nullable), is_private 

event_invitee 
event_id, user_id 

group 
id, title, is_open 

group_participant 
group_id, user_id 

所以,現在提供給我們執行的查詢類似的信息(僞)當前認證的用戶顯示事件:

SELECT 
    e 
FROM event e 
    LEFT JOIN e.invitees i WITH i.user = :current_user # is current user invited to event ? 
    LEFT JOIN e.group g 
    LEFT JOIN g.participants p WITH g.user = :current_user # is current user are participant of group? 
WHERE ((e.group IS NULL OR g.is_open = true OR (g.is_open = false AND p IS NOT NULL)) 
    AND (r.is_private = false OR (r.is_private = true AND i IS NOT NULL))) 
    AND /* other filters, like by location */ 

這是效果很好,但很slooow。並沒有可能性陳舊它。如何改變結構以獲得更快和可升級的結果?

+0

而不是僞代碼,你應該制定出實際的查詢和[解釋](http://dev.mysql.com/doc/refman/5.5/en/explain.html)以瞭解索引使用情況和可能的優化。到目前爲止,你有什麼努力來優化MySQL服務器和查詢? – Stennie

+0

在MySQL中WITH WITH? – Kermit

+0

@njk這是僞代碼。 – Koc

回答

-1

爲了加快速度:您必須將您的「左連接」重寫爲「where子句」。說起來容易做起來難。但它爲您提供了應用先刪除最多記錄的過濾器的優勢。假設一個位置只有10個事件,並且選擇了位置過濾器,則查詢不必過濾不在該位置的私人,公共或團體事件。我知道說這很容易,但是除非我有一些數據,否則不會呈現真實的代碼。我希望這能指出你正確的方向。我設法加速了超過30秒的持續查詢時間超過1秒。最後,事實證明,我們忘記了編寫生產數據庫的索引腳本。所以你也可以添加一些放置好的指數來加快速度。

+0

呃。 「左邊加入到哪裏」?你的意思是恢復舊/壞'select ... from table1,table2,table3,... where ...'語法? -1爲難以理解(和壞)的建議。 –