有許多的方式來處理大表查詢速度慢。這三個最基本的方法是:
:使用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
命令來獲取查詢計劃,以查看優化程序對查詢執行的操作。使用它來確保優化器避免對大型表進行表掃描(並且如果需要,可以創建索引或強制索引)。
如果你顯示你當前的數據庫結構,包括索引,它可能會有所幫助;和「簡單MAX(日期)」的查詢。 – Uueerdo
通常這個問題是通過索引解決的 - 可能想在嘗試這樣瘋狂的架構選擇之前嘗試 – Hogan