2017-04-23 86 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服务器会话,我们可能会考虑将历史数据移动到另一个表中。