似乎我在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查询的任何想法?而且,哪个会更快?
答案 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使用您正在测试的实际常量来根据数据声明不可能)