MySQL查询测试WHERE子句搜索时间

时间:2011-01-05 17:50:40

标签: mysql sql query-optimization where-clause

最近我被拉到了老板的办公室,并告诉我,我的一个问题是放慢了系统的速度。然后我被告知这是因为我的WHERE条款以1 = 1开头。在我的脚本中,我只是将每个搜索字词附加到查询中,因此我添加了1 = 1,以便我可以在每个搜索字词之前附加AND。有人告诉我,这会导致查询进行全表扫描,然后再缩小结果范围。

我决定测试一下。我们有一个user表,大约有14,000条记录。查询分别使用phpmyadmin和PuTTY运行了五次。在phpmyadmin中,我将查询限制为500但在PuTTY中没有限制。我尝试了一些不同的基本查询,并尝试计算时间。我发现1 = 1似乎导致查询比仅没有WHERE子句的查询更快。这是在一个实时数据库,但似乎结果相当一致。

我希望在这里发帖,看看是否有人可以为我分解结果或向我解释这方面的逻辑。 alt text

3 个答案:

答案 0 :(得分:2)

嗯,你的老板和他的信息来源都是白痴。将1=1添加到查询不会导致全表扫描。它唯一能做的就是让查询解析花费的时间更长。任何体面的查询计划生成器(包括mysql)都会意识到这个条件是NOP并将其丢弃。

我在我自己的数据库(太阳能电池板历史数据)上尝试了这个,没有任何有趣的噪音。

mysql> select sum(KWHTODAY) from Samples where Timestamp >= '2010-01-01';
seconds: 5.73, 5.54, 5.65, 5.95, 5.49
mysql> select sum(KWHTODAY) from Samples where Timestamp >= '2010-01-01' and 1=1;
seconds: 6.01, 5.74, 5.83, 5.51, 5.83

注意我使用了ajreal的查询缓存禁用。

答案 1 :(得分:1)

首先,在两次测试中你都set session query_cache_type=off;了吗?

其次,你对PHPmyadmin和Putty(mysql客户端)的测试查询都是如此不同,如何验证?
您应该在两个站点上应用相同的查询。

此外,您不能假设PHPmyadmin是查询缓存关闭。 phpmyadmin上的时间显示包括PHP处理,你也应该避免。

因此,您应该只在mysql客户端上进行测试。

答案 2 :(得分:1)

这不是确定MySQL内部情况的真正准确方法。缓存和网络变化等内容可能会影响您的结果。

你应该研究一下使用“explain”找出MySQL用于你的1 = 1的查询的查询计划。 DBA会对这些结果更感兴趣。此外,如果您的1 = 1导致全表扫描,您肯定会知道。

解释语法如下:http://dev.mysql.com/doc/refman/5.0/en/explain.html

如何解释结果在这里:http://dev.mysql.com/doc/refman/5.0/en/explain-output.html