2017-04-23 48 views
-1

我目前正試圖弄清楚爲什麼我工作的網站(Laravel 4.2框架)有時真的很慢,而且我認爲它與我的數據庫設置有關。我根本不是專業人士,所以我會假設問題出在哪裏緩慢的MySQL表

我的sessions表有大約220萬條記錄,當我運行show processlist;時,所有最長的查詢都與該表有關。

這裏是例如圖片:

enter image description here

表結構

enter image description here

Surerly我做錯了什麼,或者它正確不是指數?我不確定,對於數據庫來說不是很棒。

+0

最好的辦法是溝數據庫會話並將它們存儲在Redis之類的東西中。數據庫會話根本不適合高流量 - 在會話表中您正好會遇到這種寫爭用。 – ceejayoz

+1

你是否曾經清除過這個桌子並刪除「死亡」會話? –

回答

1

我們沒有看到正在執行的完整SQL,所以我們不能推薦適當的索引。但是,如果上的DELETE語句的唯一謂詞是在last_activity柱即

DELETE FROM `sessions` WHERE last_activity <= 'somevalue' ; 

然後DELETE語句的性能將有可能通過用somevalue一個前導列添加索引加以改進,例如

CREATE INDEX sessions_IX1 ON sessions (last_activity); 

此外,如果此表使用MyISAM存儲引擎,則DML語句不能併發執行; DML語句將在等待獲取表上的獨佔鎖時阻塞。 InnoDB存儲引擎使用行級鎖定,所以一些DML操作可以是併發的。 (InnoDB的未消除的鎖爭用,但鎖將行數和索引塊,而不是對整個表。)


還要考慮使用不同的存儲機構(比MySQL數據庫中),用於存儲和檢索Web服務器「會話」的信息。

另外,是否有必要(是否有一些要求)堅持220萬「會話」行?我們確定所有這些行實際上都需要嗎?如果某些數據是歷史數據,並且不是特別需要支持當前Web服務器會話,我們可能會考慮將歷史數據移動到另一個表中。