【发布时间】:2013-08-21 16:34:55
【问题描述】:
我的网站在访问高峰期出现严重问题。经过多次故障排除后,我发现问题出在数据库上。
我有这个在 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 TABLE:
SIZE: 6MB
ROWS: 14841
TYPE: INNODB
这是用于“STREAMS”表的
STREAMS TABLE:
SIZE: 80MB
ROWS: 135296
TYPE: MyISAM
编辑:马丁感谢您对写作提出意见。该数据库确实以相当固定的时间间隔从另一个来源填充,因此将不断发生 READ 和 WRITE 操作。我将不得不对此进行更多研究。
【问题讨论】:
-
您的表上有正确的索引吗?您不需要不从表中获取所有 (*) 数据吗?
-
当参数不是模式时,为什么要使用
LIKE?prod_name或cat_name可以包含通配符吗? -
此查询的可能瓶颈是“LIKE”、“JOIN”和子“SELECT” - 如果可能,尽量避免它们
-
你也应该给我们解释的输出。
-
您需要向我们展示表和索引定义,以及每个表的行数。也许您的表格定义不佳。也许索引没有正确创建。也许您认为您在该列上没有索引。没有看到表和索引定义,我们无法判断。我们还需要行计数,因为这会极大地影响查询优化。如果您知道如何处理
EXPLAIN或获取执行计划,请将结果也放入问题中。
标签: mysql sql database performance