最近我被拉到了老板的办公室,并告诉我,我的一个问题是放慢了系统的速度。然后我被告知这是因为我的WHERE
条款以1 = 1
开头。在我的脚本中,我只是将每个搜索字词附加到查询中,因此我添加了1 = 1
,以便我可以在每个搜索字词之前附加AND
。有人告诉我,这会导致查询进行全表扫描,然后再缩小结果范围。
我决定测试一下。我们有一个user
表,大约有14,000条记录。查询分别使用phpmyadmin和PuTTY运行了五次。在phpmyadmin中,我将查询限制为500但在PuTTY中没有限制。我尝试了一些不同的基本查询,并尝试计算时间。我发现1 = 1
似乎导致查询比仅没有WHERE
子句的查询更快。这是在一个实时数据库,但似乎结果相当一致。
我希望在这里发帖,看看是否有人可以为我分解结果或向我解释这方面的逻辑。
答案 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