我很抱歉,如果这个问题太笼统,我可以发布和示例代码,但它可能无法重现,因为无法访问实际的数据库。
假设我有一个包含大量连接和联合的大型MySQL查询,以及concat
,date
等函数,各种时间和日期转换函数。它使用了很多表,嵌套的选择查询等。假设它是select
查询。
我的问题是,如果他们需要优化此脚本以更快地运行,那么将从哪里开始?目前需要数小时才能完成。此外,如果我从中运行独立的代码块(包括一些嵌套查询等),它们运行得更快。因此存在一个或几个瓶颈。也许某些表没有正确索引。
我知道MySQL中的分析和基准测试以及explain
功能它们都有助于我们理解MySQL在幕后所做的工作,但所有这些都提供了整个脚本的总结。在不分别分析脚本的每个部分的情况下,识别这些瓶颈的最佳方法是什么?面对这样的问题时是否有最佳实践?
再次,我为提出一个可能过于宽泛的问题而道歉。我可以发布和示例代码,但它可能无法重现,因为无法访问实际的数据库。
答案 0 :(得分:2)
使用EXPLAIN
并确保我使用正确的索引后,我会在数据的子集上运行它,这样我就可以在几秒钟内完成它(在调整查询时更容易)。
我会先单独运行每个子查询,然后记下它们执行的时间。然后运行调用该子查询/派生的查询,并查看它执行的时间。注释掉一些子查询并查看它的执行情况。很快你就会知道哪些部分是你的瓶颈。
然后我会开始尝试不同的技术。也许首先使用临时表,或者我需要运行每日cron作业,为我总结数据。
因此存在一个或几个瓶颈。也许某些表没有正确索引。
这听起来像是你可以使用EXPLAIN
解决的问题?
答案 1 :(得分:0)
我不使用MySQL,但这是一种与软件无关的问题。假设你已经在做了一些"对"诸如对索引字段进行过滤等事情,有两个步骤可能会有所帮助。
首先 - 将代码移动到存储过程。这样做的好处是代码只需要编译一次。如果您当前的查询没有经常运行,则必须在每次运行时对其进行编译,这需要时间。
第二 - 使用临时表。虽然它不直观,但我发现这通常会大大缩短执行时间。