2

是否有可能優化我寫的這個查詢如何優化這個複雜的EAV MYSQL查詢?

我創建了一種動態虛擬數據庫,使我的用戶能夠添加自定義字段而不影響數據庫結構。以下是目前結構的一個非常簡單的視圖。

tables   | columns 

db_cases  | caseid 
db_structure | fieldname 
db_data  | fieldname, data, caseid 
db_names  | nameid 
  • 我們可以通過添加一行到db_structure
  • 我們希望記錄的任何數據記錄到DB_DATA創建一個新的領域。
  • 名存儲在db_names和名_ID存儲在DB_DATA

我想輸出的情況下,以一個HTML表格

希望其餘言自明,你可以看到它是多麼的效率不高。我可以通過連接做同樣的事嗎?

SELECT 
case_id, 
(SELECT data_field_value 
FROM db_data 
WHERE data_case_id = case_id AND data_field_name = 'casestatus' 
) AS casestatus, 
(SELECT forename_company 
FROM db_names 
WHERE name_id = (SELECT data_field_value 
        FROM db_data 
        WHERE data_case_id = case_id AND data_field_name = 'client1' 
       ) 
) AS client1_forename_company 
FROM db_cases 

感謝

+5

我會先縮進它並使其可以理解。 – Iznogood 2012-04-02 18:06:25

+5

動態數據庫?所以你在SQL數據庫之上放置自己的數據庫語義?可怕... http://thedailywtf.com/Articles/The_Inner-Platform_Effect.aspx – 2012-04-02 18:08:43

+11

開始刪除它。 – Chibuzo 2012-04-02 18:08:49

回答

1

其實,Chibuzo是正確的。通過刪除它:-))啓動但在此之前,玩它一點點,這是一個很好的鍛鍊; Tibial大腦,像下棋什麼的:-)

select 
    case_id, 
    d_status.data_field_value as case_status, 
    d_client1_name.forename_company as client1_forename_company 
from db_cases 
     join db_data as d_status 
      on d_status.data_case_id = case_id 
       AND d_status.data_field_name = 'casestatus' 
     join db_data as d_client1 
      on d_client1.data_case_id = case_id 
       AND d_client1.data_field_name = 'client1' 
     join db_names as d_client1_name 
      on d_client1_name.name_id = d_client1.data_field_value 

我希望這些直接加入無子查詢要有效得多儘管你必須測試它 - 在優化中經常會有驚喜。

+0

感謝Tomas這個作品是一種享受,現在正在通過查詢blitzing,但我不能忽視這個線程的建議,即EAV不是一個好主意。除了維護這樣一個數據庫(已經完成)所需的代碼量之外,我可以問爲什麼這樣的模型非常不受歡迎?縮放? – amof 2012-04-02 19:19:16

+0

@amof,所以你說它實際上比原始查詢要快得多?多少? – TMS 2012-04-02 19:39:43

+0

最初我無法在2000個案例和1個字段上運行查詢,它在30秒後超時,現在我能夠在2000個案例和10個字段上運行查詢 - 實際上它是瞬間的。目前我的模型有哪些替代方案? – amof 2012-04-02 19:45:29