0

看来我在 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;

查询 1Impossible WHERE在 EXPLAIN 中返回。查询 #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;

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

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

4

2 回答 2

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;
于 2012-08-17T04:00:37.177 回答
0

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

于 2012-08-17T03:08:16.410 回答