【问题标题】:MySQL queries testing WHERE clause search timesMySQL 查询测试 WHERE 子句搜索时间
【发布时间】:2011-01-05 17:50:40
【问题描述】:

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

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

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

【问题讨论】:

  • 如果您的结果显示更快的结果应该没问题,您是否分析了数据放缓的地方?你用什么计时?
  • 我很好奇人们对在 WHERE 子句中使用 1 = 1 的想法。不过你是对的,从我的结果来看,它确实看起来更快——这让我很高兴——但我可能想要一些理由。在任一程序中,查询运行后都会显示“查询花费了 x 秒”。我认为这就足够了。

标签: mysql sql query-optimization where-clause


【解决方案1】:

好吧,你的老板和他的信息来源都是白痴。将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 的查询缓存禁用。

【讨论】:

  • Well, your boss-man and his information source are both idiots - 我笑了
【解决方案2】:

首先,您在两次测试期间是否set session query_cache_type=off;?

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

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

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

【讨论】:

  • 这很有趣。它似乎确实使“WHERE 1 = 1”查询比无子句查询花费更长的时间,但“WHERE 1 = 1 AND firstName = 'David'”和“WHERE @987654323”之间仍然没有明显的变化@ = '大卫'"。
  • 我不认为两者有区别,主要怀疑是没有关闭查询缓存
【解决方案3】:

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

您应该考虑使用“解释”来找出 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

【讨论】:

  • 这些都是很好的观点。我将看看使用解释来尝试了解发生了什么。我仍然希望有人可以从他们的经历中为我提供一些启示。
  • 我尝试解释这些查询。除了“额外”列之外,它们都具有相同的结果。如果有 WHERE 子句,它将显示“使用 where”。有趣的是,当我执行“EXPLAIN SELECT * FROM user WHERE 1 = 1”时,它会将“Extra”列留空,就好像没有 WHERE 子句一样。
猜你喜欢
  • 2012-12-29
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
相关资源
最近更新 更多