2010-01-15 111 views
6

數據庫結構:多個MySQL查詢與多個PHP foreach循環

id galleryId     type  file_name  description 
1 `artists_2010-01-15_7c1ec` `image` `band602.jpg` `Red Umbrella Promo` 
2 `artists_2010-01-15_7c1ec` `image` `nov7.jpg`  `CD Release Party` 
3 `artists_2010-01-15_7c1ec` `video` `band.flv`  `Presskit` 

我要拉出來的圖像爲應用程序的一個部分,在另一視頻等是更好地使多個MySQL像這樣各部分查詢:

$query = mysql_query("SELECT * FROM galleries WHERE galleryId='$galleryId' && type='image'); 

...或者我應該建立一個關聯數組,只是通過在陣列上,每當我需要使用結果集在循環?

感謝您的想法。

回答

8

這取決於什麼更重要:可讀性或性能。我期望一個查詢和預填充PHP數組的執行速度會更快,因爲數據庫連接的開銷很大,但是對每個部分的簡單查詢更具可讀性。除非你知道(而不僅僅是希望),否則你會得到大量的流量,我會去單獨的查詢,然後擔心優化,如果它看起來像是一個問題。到那時,還會有其他的事情要做,比如構建一個數據訪問層並添加一些緩存。

+0

謝謝大家 - 這個(如果屬實的話)對我來說最合適,因爲每個類別中只有少數幾個文件。一個查詢是。 – jay 2010-01-15 19:39:08

0

最好有多個查詢。每次運行查詢時,所有數據都會被取出並加載到內存中。如果你有5種不同的類型,這意味着每種類型的頁面加載5倍於其需要的數據量。

即使一次只有一個,如果您有超過100個,或者您可以合理地在一個頁面上合理顯示的次數很多,您可能會很快開始使用LIMIT/OFFSET查詢進行分頁。

2

如果用「sections」表示用戶可以查看的單獨的單個頁面(單獨的HTTP請求),那麼我會根據需要建議每種類型的查詢。如果在只有圖像數據集的頁面上,您確實不需要獲取視頻數據集。你不會真的節省很多時間提取所有的東西,因爲無論如何,你將連接到每個頁面的數據庫(我假設)。

如果用「sections」表示一個頁面的不同部分,立刻。這可以節省您的查詢時間(只有一個查詢)。

但是,根據數據集的大小,您可能會遇到PHP內存限制查詢所有內容的麻煩。然後,您可以嘗試提高內存限制,但如果失敗了,您可能不得不退回到每種類型的查詢。

使用query-per-type方法會將一些計算負載移至數據庫服務器,因爲您只會請求並獲取您真正需要的內容。而且您不必編寫代碼來篩選和排序結果。過濾和排序是數據庫通常比PHP代碼更好的事情。如果可能的話,啓用MySQL的查詢緩存,這將加快這些查詢的速度,遠遠超過您可以用PHP編寫的任何內容。

1

如果您的數據都來自一個表,我只會做一個查詢。

我認爲你正在建立一個頁面,包括圖片部分,視頻部分,音樂部分等。編寫你的查詢按媒體類型排序的返回結果 - 遍歷所有圖片,然後所有視頻,然後是所有的音樂。