2017-05-31 27 views
0

我有一個真正成爲一個大的MySQL數據庫。因爲這個,我可以感覺到網站變慢了。分裂數據,使其更快,更方便

現在,在很多頁面我只需要數據的某一部分。例如,我爲了歷史目的每5分鐘存儲一次用戶信息。但是在一頁上我只需要最新的信息(而不是整個數據歷史)。我在查詢中通過一個簡單的MAX(date)來實現這一點。

現在我想知道,如果它不會是更好地使一個單獨的表,只是存儲的最新數據,以便查詢不必從一個特定的用戶數以百萬計的行,但與搜索最新數據取而代之的是隻有每個用戶最新數據的表格。

  • 在這裏CON將是我要運行2個查詢插入最新的歷史在我的數據庫每5分鐘,即插入在歷史表中的新數據和更新數據的最新歷史記錄表。

  • 親將是MySQL有少了很多數據要經過。

什麼是處理這類問題的常用方法?

+3

如果你顯示你當前的數據庫結構,包括索引,它可能會有所幫助;和「簡單MAX(日期)」的查詢。 – Uueerdo

+2

通常這個問題是通過索引解決的 ​​- 可能想在嘗試這樣瘋狂的架構選擇之前嘗試 – Hogan

回答

4

有許多的方式來處理大表查詢速度慢。這三個最基本的方法是:


:使用indexes,和use them correctly。在大型桌子上avoid table scans很重要;這幾乎總是您單次查詢時最重要的性能。

例如,如果您在user_id列的活動表上查詢類似於:select max(active_date) from activity where user_id=?,然後create an index。您可以在索引中包含多個列,並在一個表中包含多個索引。

CREATE INDEX idx_user ON activity (user_id) 

:使用匯總/ 「緩存」 表。這是你的建議。在你的情況,你可以申請一個插入trigger到你的活動表,每當有新行插入將更新您的彙總表。這將意味着你不需要你的代碼來執行兩個查詢。例如:

CREATE TRIGGER update_summary 
AFTER INSERT ON activity 
FOR EACH ROW 
UPDATE activity_summary SET last_active_date=new.active_date WHERE user_id=new.user_id 

可以改變,要檢查是否有行存在的用戶已經做插入如果是自己的第一項活動。或者,當用戶註冊時,您可以在彙總表中插入一行...或者其他任何內容。


:請查看查詢!使用MySQL的EXPLAIN命令來獲取查詢計劃,以查看優化程序對查詢執行的操作。使用它來確保優化器避免對大型表進行表掃描(並且如果需要,可以創建索引或強制索引)。

+1

這是一個很好的答案@Robbie – Hogan

+1

非常感謝。這真的有幫助。現在在工作臺中導入數據庫,並嘗試一些事情! –

+1

謝謝Hogan。 @Merijndk在你的具體情況下,我會建議使用一個彙總表。我毫不懷疑向表中添加索引會使您的查詢立即返回,但在企業規模上,DBA會很感激您保持查詢遠離可能被查詢鎖定的大型活動表。如果您每5分鐘記錄一位用戶,並且擁有10,000名用戶,那麼主表上已經有很多操作(每秒3-4次插入)。 – RToyo