2010-06-27 185 views
1

我目前正在使用mysql w/PHP,因爲這是我學到的東西,並且從來沒有使用任何其他東西。在我目前的項目中,我有一個數據庫,有1000萬行和10列,並且在本地(Windows)環境以及生產環境(linux)中執行復雜的調用時發現它非常慢。兩臺服務器都有超過10GB的內存。我已經安裝了Zend AMF,所以所有的數據傳輸都是二進制的。如何優化MySQL查詢?

我自學成才,從來沒有人教過我有效的DBM的靈感。我的第一個想法是打破數據庫成塊,然後改變我所有的PHP代碼..看起來像很多麻煩,並在PHP代碼中出現錯誤...有沒有更好的方式,我不知道?

我的用戶界面基於閃存,如果它意味着速度的顯着提高,我願意更換中間件。在這一點上,我真的只知道PHP作爲中間件。

我不想在這一點上學到另一個數據庫,並認爲必須有一些交易技巧來優化我的表現,但是在我侵入我的數據庫之前想獲得一些想法。

fyi:數據庫只能從用戶的角度閱讀。用戶不會將任何新數據輸入到數據庫中。另外,在數據庫中的1000萬行中,只有大約20萬個被大量使用。 (我不知道哪200千行被大量使用,因爲錄製這些信息可能會讓我的數據庫變得更慢)。

每次調用是一樣的東西:

SELECT name, id, address 
FROM  table 
WHERE date_added=? 
LIMIT ?,? 
ORDER BY no_children ASC 

...和其他各種 「選擇」 的聲明。

+0

PS:'LIMIT'條款應遵循'ORDER BY' – zerkms 2010-06-27 05:57:54

回答

3

date_added字段中有index嗎?如果沒有,創建一個,然後再試一次:

CREATE INDEX ix_date_added on table (date_added); 

您還可能有興趣在檢查出從MySQL參考手冊的以下文章:

你也應該嘗試在您的SELECT語句前使用EXPLAIN以查看查詢是否將使用您的任何索引。這通常是正確排除性能問題的第一步。

+0

,你仍然會得到的文件排序,以滿足'ORDER BY'子句。 – zerkms 2010-06-27 05:56:28

0

這個回答也是一種回答到@Daniel瓦薩洛的一個:

CREATE INDEX ix_date_added_no_children on table (date_added, no_children); 

更正確

+0

從此演示http://assets.en.oreilly.com/1/event/21/Covering%20Indexes_%20Retrieving%20Data%20Without%20Accessing%20It%20Presentation.pdf 它看起來像我應該考慮轉換爲InnoDB作爲我的選擇語句變得更復雜。 – kristen 2010-06-27 19:34:01