我需要一种简单的方法来测试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
答案 0 :(得分:8)
尝试使用SELECT BENCHMARK(次数,查询)
更多信息:http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_benchmark
答案 1 :(得分:4)
你的第一个查询可能会慢一点,因为MySQL实际上是在第一个查询上访问磁盘而不是第二个查询。
您的操作系统可能会在读取内存时将文件缓存在内存中;因此,后续读取可能不需要实际命中磁盘,并且返回速度会快得多。
根据经验,我通常会运行几次查询,并寻找一致性。通常情况下,第一次运行需要花费几倍的时间,而第二次运行和第四次需要大约相同的时间。这些后续运行可能更能代表您在实际生产系统中看到的性能 - 因为您的生产数据库应该将这些数据保存在OS缓存中,而您的开发系统很少被访问。
最后,当涉及到查询性能时,在大多数情况下,您应该快速通过开发,并监视生产中的慢查询日志以查看哪些查询真正需要工作。
就性能数据的编程运行查询而言 - 采取几个样本,并使用中位数。但实际上,这并不能很好地代表您在生产中遇到的实际性能问题。
答案 2 :(得分:2)
我们假设:
如果您真的想要对查询进行基准测试,则必须执行以下操作:
$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 STATUS
和EXPLAIN ...
返回的非常宝贵的信息。这会好很多。
以下是您喜爱的链接: http://www.xaprb.com/blog/2006/10/12/how-to-profile-a-query-in-mysql/
享受。 :)
答案 3 :(得分:0)
您可能在班级中使用持久连接。 pconnect将重用连接,并将考虑这种类型的延迟。