2015-11-23 130 views
1

我正在開發一個數據庫,我需要創建一個查詢。該數據庫將保存有一個主表「警報」是涉及所有與該警報以下列方式中的其它表的信息從一般的警告信息:複雜的查詢策略

  • 警報表包含以下幾列:analyzer_id,create_time_id( ...)和classification_id。 (警報與其餘表格之間爲1到n關係)

  • alert_has_source表包含以下列:alert_id和source_id。 (警報與源之間的關係爲n)

  • alert_has_targets包含以下列:alert_id和target_id。 (正對警報和目標米之間的關係)

enter image description here

我在mysql的愛好者,所以我不知道如果數據庫是精心設計的,這是表達方式信息。

我需要查詢表格分析器,分類,create_time,源(帶有節點和地址),目標(帶有節點和地址)的某些列需要根據表classification.ident =「log」 。

1)我應該在數據庫中創建一個視圖並提供查詢嗎?這表現不錯嗎?

2)關於查詢應該使用多個選擇還是內部聯接?

3)如何優化搜索由於我只需要數據庫的一部分?

+0

1),你可以。 No.2)通常,INNER JOIN將勝過多個選擇。 3)指數是關鍵(原諒雙關語) – Strawberry

回答

1

您的問題不像您需要的結果集那樣具體。這使得難以具體回答。

不過,這裏是一個嘗試。

1)我應該在數據庫中創建一個視圖併爲其提供查詢嗎?

你可以這樣做。這是封裝複雜查詢的一種便捷方式。首先讓查詢工作,然後從中查看。

這樣表現不錯嗎?

在MySQL視圖中,它們的性能通常與它們的單一查詢等效項非常相似。其他數據庫(例如PostgreSQL,Oracle)對視圖進行了優化。

2)關於查詢,我應該使用多個選擇還是內部連接?

如果你需要一個確定的結果集 - 某個虛擬表,每個項目有趣的一排 - 這是從你的表組成,你應該使用連接表的策略。如果您需要來自不同表格的一組鬆散相關的數據點,則可以分別選擇這些數據點。

INNER JOIN是一種類型的JOIN的。有時您可能需要使用LEFT JOIN。 a LEFT JOIN b可以更好地爲您服務,當桌子a包含行從表b失蹤。 INNER JOIN,除非它們出現在的連接兩側從結果集中抑制行。

3)如何優化搜索由於事實 我只需要數據庫的某些部分?

這是在SQL指標的目的。你可以在這裏讀到它。 http://use-the-index-luke.com/

+0

感謝您的反饋,我將開始創建查詢和優化我會指數爲「where」子句的組件。 –

+1

請注意索引。 MySQL很難利用表中的多個索引。精心挑選的複合指數效果更好。 –