如何测试MySQL查询速度,减少不一致性?

时间:2009-07-27 22:45:29

标签: php mysql performance

我需要一种简单的方法来测试SQL查询的速度。我不担心硬件差异,我基本上需要一个相对数字。

这就是我用PHP做的事情(模糊但有效):

// CONNECT TO DB HERE

$sub = new YomoSubscription(95,783);

$t = microtime(TRUE);

// contains the SQL db call i'm testing
$fp = $sub->generateFingerprint(); 

echo microtime(TRUE)-$t;

我遇到的问题是,有时在初始连接/运行时,我的测试需要1.25秒。但是在随后的连接中需要0.004秒...... 为什么这是

我非常确定my.ini中的MySQL查询缓存已关闭:

query_cache_size=0

4 个答案:

答案 0 :(得分:8)

尝试使用SELECT BENCHMARK(次数,查询)

更多信息:http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_benchmark

答案 1 :(得分:4)

你的第一个查询可能会慢一点,因为MySQL实际上是在第一个查询上访问磁盘而不是第二个查询。

您的操作系统可能会在读取内存时将文件缓存在内存中;因此,后续读取可能不需要实际命中磁盘,并且返回速度会快得多。

根据经验,我通常会运行几次查询,并寻找一致性。通常情况下,第一次运行需要花费几倍的时间,而第二次运行和第四次需要大约相同的时间。这些后续运行可能更能代表您在实际生产系统中看到的性能 - 因为您的生产数据库应该将这些数据保存在OS缓存中,而您的开发系统很少被访问。

最后,当涉及到查询性能时,在大多数情况下,您应该快速通过开发,并监视生产中的慢查询日志以查看哪些查询真正需要工作。

就性能数据的编程运行查询而言 - 采取几个样本,并使用中位数。但实际上,这并不能很好地代表您在生产中遇到的实际性能问题。

答案 2 :(得分:2)

我们假设:

  1. 您不使用持久连接
  2. 安装在统计信息所在的服务器上的数据库(无网络连接)
  3. 其他人没有使用数据库(行/表锁)
  4. 没有其他繁重的进程正在运行
  5. 等...
  6. 如果您真的想要对查询进行基准测试,则必须执行以下操作:

    $database->query('SET SESSION query_cache_type = OFF');
    

    然后在循环中运行查询2-3次(“预热”服务器)。

    只有这样:

    $database->query('FLUSH STATUS'); #If you use the stats to profile your query
    
    $t = microtime(TRUE);
    $fp = $sub->generateFingerprint();
    echo microtime(TRUE)-$t;
    
    $database->query('SHOW STATUS');
    

    Et瞧! :)))

    BTW,查询速度是要读取的参数之一。了解如何阅读SHOW STATUSEXPLAIN ...返回的非常宝贵的信息。这会好很多。

    以下是您喜爱的链接: http://www.xaprb.com/blog/2006/10/12/how-to-profile-a-query-in-mysql/

    享受。 :)

答案 3 :(得分:0)

您可能在班级中使用持久连接。 pconnect将重用连接,并将考虑这种类型的延迟。