2013-04-26 17 views
1

我正在使用WordPress的一些自定義帖子類型(只是爲了給我的數據庫結構的描述 - 它的WP)。速度選擇不同與陣列獨特

每個帖子都有自定義元,它存儲在一個單獨的表(postmeta表)中。就我而言,我正在儲存城市和州。

我已經添加了一些行動,以WP的save_post/trash_post掛鉤,使城市和狀態也存儲在一個單獨的表(市),像這樣:

ID postID city  state 
auto int  varchar varchar 

我這樣做是因爲我認爲這表格會比查詢相當大的可能城市和州列表的postmeta表更快。

我的邏輯也迫使我添加/更新每個帖子的城市和州,即使這會導致重複(在城市/州的字段中)。這一定是如此,因爲我必須跟蹤哪些州/城市存在(實際上有與他們相關的職位)。當某個帖子被添加或刪除時,它將記錄到城市表中或從中刪除。

這使我想到我的問題。

  1. 這個邏輯是否有意義,還是我在DB設計上吸吮?
  2. 如果有一定道理,我真正的問題是這樣的:**它會更快地使用MySQL的「SELECT DISTINCT」或只是「SELECT *」,然後使用PHP的array_unique對結果**

編輯評論/答案到目前爲止:
表的結構正是我如何在上面鍵入它。有一個關於ID的索引,但該表的重點不是檢索索引列表,而是檢索所有可用城市/州組合列表的所有結果(唯一的)。

我想我可能會去(我不知道爲什麼我沒有想到這個之前)只需在wp_options表中的一條記錄中添加一個城市/狀態組合列表。然後,我可以獲取該記錄,並篩選出我需要的唯一記錄。 我能對此有所反饋嗎?我會想象,檢索和過濾序列化數組將比存儲在一個單獨的表中檢索數據更快。

+1

我不能對1說話,但答案2幾乎可以肯定MySQL會更快。也就是說,如果不瞭解更多關於數據的信息 - 記錄數量,索引數量等等,不可能說出來。但是對於大多數使用MySQL處理的應用程序而言,通常會比使用PHP更快。 – Madbreaks 2013-04-26 17:24:13

+0

我將問題1留給其他人,因爲我與WP的邊界無能,但至於問題2,我建議在服務器上使用「SELECT DISTINCT」。 MySQL可能會盡快處理它,並且在發送結果時,網絡和數據庫之間的流量會減少。 – 2013-04-26 17:25:13

+0

考慮數據庫拉出和返回(比如說)從十億記錄DB,v.s.中的1000個不同記錄之間的差異。 db通過線路發送這些十億條記錄並讓PHP執行過濾。 – 2013-04-26 18:19:52

回答

2

要回答你關於使用SELECT distinct與array_unique有關的問題,我會說我幾乎總是會傾向於限制數據庫中的結果集,當然假設你正在嘗試的字段上有合適的索引獲得不同的價值。這樣可以節省您將額外數據從數據庫傳輸到應用程序的時間以及將數據讀取到可以使用它的內存中的應用程序。

就您的單獨表格設計而言,很難推測這是否是一種好方法,這很大程度上取決於您如何實際執行查詢(即,您是否在執行兩個單獨的查詢 - 一個用於發佈info和一個城市/州信息或通過連接查詢?)。

這實際上只是一種確定最快方法的確定方法。這是爲了在您的環境中測試兩種方式。

0

1)完全標準化的表(當它只有整數值,其他表只有一個int + varchar時)有利於不經常進行全表連接,並在標準化字段上進行大量搜索。作爲缺點,它需要大量的連接/排序緩衝區,並導致更復雜的查詢=少得多的機會查詢將由mysql自動優化。所以你可以自己優化你的查詢。 2)在幾乎任何情況下,選擇不同都會更快。只有情況會比較慢 - 你在/etc/my.conf中有很小的排序緩衝區,而php的緩衝區大小要大得多。

不同的select可以使用索引,而你的代碼不能。 也發送大量的數據到您的應用程序需要很多的MySQL cpu時間和實時。