使用具有连接的子查询计算行索引,导致A * B检查行

时间:2015-01-22 20:51:19

标签: mysql

这个问题来自我之前开始的问题:Incorrect row index when grouping

由于性质不同,我在这里问,一旦我解决这个问题,我会在那里提供答案。


我想到了子查询,并想出了这个:

SELECT
    mq.*,
    @indexer := @indexer + 1 AS indexer
FROM
(
    SELECT
        p.id,
        p.tag_id,
        p.title,
        p.created_at
    FROM 
        `posts` AS p
    LEFT JOIN
        `votes` AS v
            ON p.id = v.votable_id
            AND v.votable_type = "Post"
            AND v.deleted_at IS NULL
    WHERE
        p.deleted_at IS NULL
    GROUP BY
        p.id
) AS mq
JOIN
    (SELECT @indexer := 0) AS i

实际上有效,我得到了理想的结果:

+----+--------+------------------------------------+---------------------+---------+
| id | tag_id |               title                |     created_at      | indexer |
+----+--------+------------------------------------+---------------------+---------+
|  2 |      2 | PostPostPost                       | 2014-10-23 23:53:15 |       1 |
|  3 |      3 | Title                              | 2014-10-23 23:56:13 |       2 |
|  4 |      2 | GIFGIFIGIIF                        | 2014-10-23 23:59:03 |       3 |
|  5 |      2 | GIFGIFIGIIF                        | 2014-10-23 23:59:03 |       4 |
|  6 |      4 | My new avatar                      | 2014-10-26 22:22:30 |       5 |
|  7 |      5 | Hi, haiii, oh Hey !                | 2014-10-26 22:38:10 |       6 |
|  8 |      6 | Mclaren testing stealth technology | 2014-10-26 22:44:15 |       7 |
|  9 |      7 | Just random thoughts while pooping | 2014-10-26 22:50:03 |       8 |
+----+--------+------------------------------------+---------------------+---------+

现在的问题是......我运行了一个EXPLAIN查询,看看它有多快。而且,我在那里有一个真正困扰我的数字:

Abnormally high row count.

嗯,数字显而易见:252 * 1663 = 419076

这让我很担心 - 那里的行数正常,或者我必须优化查询?如果是这样,那我该如何优化这个呢?

1 个答案:

答案 0 :(得分:1)

从MySQL version 5.7开始,所有连接都被视为嵌套循环连接。

  

MySQL使用嵌套循环连接方法解析所有连接。这意味着MySQL从第一个表中读取一行,然后在第二个表,第三个表中找到匹配的行,依此类推。

所以回答你的问题......不,你将无法让这一行倒计时。但是,通过向连接列添加索引,您可以获得更快的结果,但行数将相同。