【问题标题】:MYSQL Explain Giving an "Impossible WHERE" with SELECT Count(x) QueryMYSQL 解释使用 SELECT Count(x) 查询给出“不可能的 WHERE”
【发布时间】:2012-08-13 12:22:27
【问题描述】:

似乎我在 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 查询的任何想法?还有,哪个更快?

【问题讨论】:

    标签: mysql database select where


    【解决方案1】:

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

    【讨论】:

    • 看来所有 WHERE 1 = 1、WHERE 0 > 1、WHERE 0
    • 对不起,我的深度不够,我无法安装 mysql =(
    【解决方案2】:

    在 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-30
      • 1970-01-01
      • 2012-08-18
      • 2014-01-20
      • 1970-01-01
      • 2017-10-28
      相关资源
      最近更新 更多