打破大型SQL命令/性能(MySQL)

时间:2017-08-25 15:50:58

标签: mysql sql sqlperformance sqlprofiler

我很抱歉,如果这个问题太笼统,我可以发布和示例代码,但它可能无法重现,因为无法访问实际的数据库。

假设我有一个包含大量连接和联合的大型MySQL查询,以及concatdate等函数,各种时间和日期转换函数。它使用了很多表,嵌套的选择查询等。假设它是select查询。

我的问题是,如果他们需要优化此脚本以更快地运行,那么将从哪里开始?目前需要数小时才能完成。此外,如果我从中运行独立的代码块(包括一些嵌套查询等),它们运行得更快。因此存在一个或几个瓶颈。也许某些表没有正确索引。

我知道MySQL中的分析和基准测试以及explain功能它们都有助于我们理解MySQL在幕后所做的工作,但所有这些都提供了整个脚本的总结。在不分别分析脚本的每个部分的情况下,识别这些瓶颈的最佳方法是什么?面对这样的问题时是否有最佳实践?

再次,我为提出一个可能过于宽泛的问题而道歉。我可以发布和示例代码,但它可能无法重现,因为无法访问实际的数据库。

2 个答案:

答案 0 :(得分:2)

使用EXPLAIN并确保我使用正确的索引后,我会在数据的子集上运行它,这样我就可以在几秒钟内完成它(在调整查询时更容易)。

我会先单独运行每个子查询,然后记下它们执行的时间。然后运行调用该子查询/派生的查询,并查看它执行的时间。注释掉一些子查询并查看它的执行情况。很快你就会知道哪些部分是你的瓶颈。

然后我会开始尝试不同的技术。也许首先使用临时表,或者我需要运行每日cron作业,为我总结数据。

  

因此存在一个或几个瓶颈。也许某些表没有正确索引。

这听起来像是你可以使用EXPLAIN解决的问题?

答案 1 :(得分:0)

我不使用MySQL,但这是一种与软件无关的问题。假设你已经在做了一些"对"诸如对索引字段进行过滤等事情,有两个步骤可能会有所帮助。

首先 - 将代码移动到存储过程。这样做的好处是代码只需要编译一次。如果您当前的查询没有经常运行,则必须在每次运行时对其进行编译,这需要时间。

第二 - 使用临时表。虽然它不直观,但我发现这通常会大大缩短执行时间。