我目前正在试图弄清楚为什么我正在使用的网站(Laravel 4.2框架)有时很慢,我认为这与我的数据库设置有关。我根本不是职业选手所以我会认为问题出在哪里
我的sessions
表中有大约220万条记录,当我运行show processlist;
时,所有占用时间最长的查询都与该表有关。
以下是一张图片:
表格结构
当然,我做错了什么,或者索引没有正确?我不确定,数据库不是很棒。
答案 0 :(得分:1)
我们没有看到正在执行的完整SQL,因此我们无法推荐适当的索引。但是,如果DELETE语句的唯一谓词在last_activity
列上,即
DELETE FROM `sessions` WHERE last_activity <= 'somevalue' ;
然后,通过添加前导列为somevalue
的索引,可能会改善DELETE语句的性能,例如
CREATE INDEX sessions_IX1 ON sessions (last_activity);
此外,如果此表使用MyISAM存储引擎,则DML语句不能并发执行; DML语句将在等待获取表上的独占锁时阻塞。 InnoDB存储引擎使用行级锁定,因此一些DML操作可以是并发的。 (InnoDB不会消除锁争用,但锁会在行和索引块上,而不是在整个表上。)
还考虑使用不同的存储机制(MySQL数据库除外)来存储和检索Web服务器&#34;会话&#34;的信息。
此外,是否有必要(有一些要求)坚持220万&#34;会议&#34;行?我们确定所有这些行都是真正需要的吗?如果某些数据是历史数据,并且并非特别需要支持当前的Web服务器会话,我们可能会考虑将历史数据移动到另一个表中。