2011-07-27 22 views
3

我想知道是否有人对我的情况有建议:如何从许多小查询中找到较慢的MySQL查询

我有一个运行数万个查询的进程。整个过程需要5到10分钟。我想知道哪些查询的运行速度比其他查询慢,但我知道它们中的任何一个都不会超过5秒(具有很多查询,这在我的日志中会非常明显)。我应该如何找出哪些花费最多的时间,并且如果优化了,会提供最好的结果?

更多细节:

我的查询运行单线程和同步的,我会说70%SELECT和30%的INSERT/UPDATE。我不得不把它们合并起来,并确定是否可以将工作分解成可以同时运行的不同单元 - 我不确定...

所有查询都是简单的INSERT语句,属性UPDATE语句或SELECT语句,主键或外键或双字段ANDed限制。

说明这一问题的:

我正在做什么基本上复制复杂的有向图结构,其全部内容。节点是数据库条目,邻接表示基本上是外键,但不是严格地说(它们可以是两个字段的组合,其中第一个表示第二个是什么表)。

+0

你如何衡量“较慢”?已用时间?也许一个稍长的查询只会经常发生1/10。或者做了10倍的工作。也许查询需要15秒。但不会阻止任何其他查询。您的处理时间是cpu-bound还是I/O bound或磁盘访问限制?您的交易是单线程的,但可能是多线程的?什么样的锁定发生,如果有的话? – dkretz

+0

查看更新描述 –

回答

3

看看MySQL的slow query log。您可以配置什么被视为“慢”的阈值。

+0

您是否知道慢速查询日志是否可以有小于整秒的增量? –

1

基本上,从查询开始跟踪时间查询结束,例如:

function getmicrotime() { 
    list($usec, $sec) = explode(" ",microtime()); 
    return ((float)$usec + (float)$sec); 
} 

$query_start = getmicrotime(); 
$query = 'SELECT ...'; 
mysql_query($query, $connect); 
$query_end = getmicrotime(); 
if ($query_end - $query_start > 2) { 
    // add query to log 
    your_slow_queries_logger($query); 
} 

我sugest做出某种包装为mysql_query功能会照顾登录慢查询。

我个人而言,使用syslog

0

如果您在优化MySQL的严重登录我的查询速度慢,在这本书

High Performance MySQL: Optimization, Backups, Replication, and More

一些内容可能会过时的最新有一个读MySQL版本,但应该足够覆盖MySQL 5.1。它还有一个广泛的基准章节,以及技术和方法,并指导您创建适合您需求的基准计划。

它还有关于索引和查询优化的章节,如果您需要优化基准确定的慢速查询,这对您会非常有用。