我的网站在高峰访问期间遇到严重问题。经过多次故障排除后,我发现问题就在于数据库。
我有一个在Index上运行的主查询,它可以检索数据表。
在繁忙的一天,该网站需要30到45秒才能加载第一次,但每次加载后都会非常快地加载约5分钟,之后再次减速并最终由于负载太大导致网站停机
我直接在数据库上测试了查询,它的执行完全相同。
这会更多地与查询或MySQL配置有关吗?
它的返回结果非常好,但是在繁忙的一天,当列表非常大时,它会真的变慢并杀死网站。
编辑:
感谢您提出的所有建议。
我略微重写了查询并对数据库进行了一些修改,因为有些名称不合理。
在完成所有建议之后,我还修改了查询以删除通配符搜索以及对不再需要的表的一些冗余请求。
以下是查询本身:
SELECT g.id, g.`name`, g.scores, g.sportFK, g.`desc`, g.`date`, s.id AS streamid
FROM games AS g
LEFT JOIN streams AS s ON s.gameFK = g.id
WHERE
(g.date >= '" . $date . "' AND g.date <= '" . $newdate . "')
AND g.sportFK IN (" . $sportfk . ")
ORDER BY g.date ASC"
在测试完之后,查询的第一次执行仍然在33s运行,并且每次后续执行都在0.04s运行,这表明当高峰时间到来时,对站点的影响将是相同的。
我还从EXPLAIN
准备了所要求的信息。
这是'GAMES'表
GAMES TABLE:
SIZE: 6MB
ROWS: 14841
TYPE: INNODB
这是针对'STREAMS'表
STREAMS TABLE:
SIZE: 80MB
ROWS: 135296
TYPE: MyISAM
编辑:马丁感谢你提出有关写作的观点。此DB也会以相当规律的间隔从另一个源填充,因此将发生常量的READ和WRITE操作。我将不得不对此进行更多的研究。
答案 0 :(得分:1)
可能发生的是,第一次运行查询时的额外时间用于编译查询和开发执行计划。这会暂停一段时间,然后再次发生。
解决方案是将查询放入存储过程。
答案 1 :(得分:1)
好吧,这个查询对每个数据库开发人员来说都是恐怖的表现: - )
由于查询编译和执行计划计算,第一次时间可能会延长。您可以使用EXPLAIN
来查看它。
由于行为在5分钟内重复,我会说索引本身或缺少索引应该存在问题。
您应该指定网站加载中是否只有读取,还是同时读取(使用您的查询)以及写入。
一旦您还执行写入操作,索引重新计算即可进入游戏状态。另一个可能的问题是锁定。假设有人每隔5分钟写一次数据,那么查询就非常复杂,所以它应该锁定写入事务的表,你的读取会等到提交/回滚。
请注意,此查询非常复杂,并且永远不会很快 - 我的意思是非常快。
你看到有几个索引。写操作只是锁定表和索引并更新它们,你有5个。内心数也不好。
如果您需要非常好的性能或定义经典方法,我会建议更好的数据库或域设计:经常读取或写入?而不是重新设计它。
答案 2 :(得分:0)
如果多次执行查询,数据库通常会进行缓存以提高性能是正常的。 如果要提高性能,可能需要获取解释计划,并改进数据库结构或改进查询结构。
要改进数据库,请检查解释计划并确保没有像全文扫描这样的昂贵操作。 例如,您可能希望看到在g.name和连接列上添加索引的影响。 尝试添加索引,看看成本的改进。 在添加索引时要小心,因为写入速度慢并且会增加数据库大小。