MYSQL解释使用SELECT Count(x)查询给出“不可能的WHERE”

时间:2012-08-17 03:04:49

标签: mysql database select where

似乎我在SELECT查询中得到了“不可能的WHERE”。我在下面发布了两个查询,这些查询区分了子查询。这些查询的作用是在更新计数之前检查用户之前是否保存了一次。我使用SELECT进行测试,但实际的查询将使用UPDATE:

UPDATE articles SET article_count = article_count+1 
WHERE id = 2343243 AND (
    SELECT COUNT(*) 
    FROM posts as p
    WHERE p.post_id = 2343243 AND p.user_id = 3
) = 1;

我正在使用以下两个查询来查看数据是否在表中(仅用于测试):

EXPLAIN 
SELECT a.id 
FROM articles as a 
WHERE a.id = 2343243 AND (
    SELECT COUNT(*) 
    FROM posts as p
    WHERE p.post_id = a.id AND p.user_id = 3
) = 1;

查询1 在EXPLAIN中返回Impossible WHERE。 查询#2的select_type是SUBQUERY。

EXPLAIN 
SELECT a.id 
FROM articles as a 
WHERE a.id = 2343243 AND (
    SELECT COUNT(*) 
    FROM posts as p
    WHERE p.post_id = 2343243 AND p.user_id = 3
) = 1;

查询2 在EXPLAIN中返回Impossible WHERE noticed after reading const tables查询2 的select_type是DEPENDENT SUBQUERY。

问题:有关如何使这不是一个不可能的WHERE查询的任何想法?而且,哪个会更快?

2 个答案:

答案 0 :(得分:1)

在Mysql.com上阅读关于Impossible WHERE之后,在查询中使用WHERE 1 = 1这样的约束并不是一个好主意:

  

因为这种情况永远不可能成立,所以   EXPLAIN语句将显示Impossible WHERE字样。非正式地,我们   在MySQL,说WHERE已被优化了。

Mysql.com:http://dev.mysql.com/doc/internals/en/optimizer-eliminating-dead-code.html

我决定放弃查询我编写的新查询,该查询利用主查询和子查询的索引,这是一个更快的解决方案,看起来更简单:

UPDATE articles 
SET article_count = IF (
    (SELECT count(*) FROM posts WHERE post_id = 2343243 AND user_id = 3) = 1, article_count+1, article_count) 
WHERE id = 2343243;

答案 1 :(得分:0)

不使用实际常量的预准备语句可能会有所帮助(如果mysql使用您正在测试的实际常量来根据数据声明不可能)