2010-12-23 49 views
1

我使用PHP和MYSQL(MYISAM)創建電子商務Web應用程序。我想知道如何加快我的查詢針對大型數據庫的mysql優化

我有一個超過一百萬記錄與以下列的產品表:id(int,primary)catid(int)usrid(int)title(int)description(int)狀態(枚舉)日期(日期時間)

最近我根據產品類別(catid)將此表分成多個表。認爲它可能會減少服務器上的負載。

現在我需要從這些表中獲取結果,並結合以下幾組條件1.結果與usrid和狀態匹配。 (用於獲取用戶產品)2結果匹配狀態和標題或描述(例如:用於產品搜索)

現在我必須使用UNION從這些所有表中取得結果,這會降低表達的風險也不會將LIMIT應用於組合結果集。我想在所有這些列上創建一個索引來加速搜索,但這可能會降低插入和更新的速度。同樣,我正在認爲分裂桌子並不是一個好主意。

我想知道在這種情況下優化數據檢索的最佳方法。我也接受新的數據庫模式提案。

+0

你能否給我們提供一個示例Database-Layout?另外,你是否考慮使用`JOIN`? – Bobby 2010-12-23 10:58:39

+0

如果您使用相關的表和關鍵字概述了當前的數據庫模式,那將會很有幫助。 對於擁有數百萬條記錄的表,我建議不要聯合或將它們聯接到其他表中,而是在表上進行單個查詢並讓腳本組合您的結果。 – Oli 2010-12-23 11:00:33

回答

1

要啓動:load test並打開MySQL slow query log

其他一些建議:

如果每個類別的單獨的表呆在使用UNION ALL代替UNION。 UNION的原因意味着獨特性,這使得數據庫引擎做了額外的工作來不必要地重複數據刪除行。

索引確實會增加寫入損失,但您所描述的讀寫比率可能至少爲10比1,可能更像是1000比1或更高。所以索引。對於您描述的兩個查詢,我可能會創建三個索引(您需要研究解釋計劃以確定哪些列順序更好)。

  1. usrid和狀態
  2. 地位和頭銜
  3. 狀態和描述(這是一個可轉位場?)

對指數的另一個音符,creating a covering index,這是一個有你的所有列,如果您的某個頻繁訪問模式是通過主鍵進行檢索的話,也可以成爲一種有用的解決方案。

0

你有沒有考慮過使用memcached?它從服務器上的數據庫查詢緩存結果集,並在多個用戶請求時返回它們。如果它沒有找到緩存結果集,那麼只有它纔會查詢數據庫。它應該顯着減輕數據庫上的負載。

http://memcached.org/