Mysql 像那样使用它执行得更快。我是这样做的,就像你说的那样。@RiggsFolly你只使用故事和表1中的数据,为什么所有其他的连接?内部联接可能会减少数量(只计算那些具有相关记录的记录)。是的,exaclty@AkinaThe distinct count是一个

Mysql 像那样使用它执行得更快。我是这样做的,就像你说的那样。@RiggsFolly你只使用故事和表1中的数据,为什么所有其他的连接?内部联接可能会减少数量(只计算那些具有相关记录的记录)。是的,exaclty@AkinaThe distinct count是一个,mysql,sql,performance,count,Mysql,Sql,Performance,Count,像那样使用它执行得更快。我是这样做的,就像你说的那样。@RiggsFolly你只使用故事和表1中的数据,为什么所有其他的连接?内部联接可能会减少数量(只计算那些具有相关记录的记录)。是的,exaclty@AkinaThe distinct count是一个非常缓慢的操作。数据库必须对结果进行排序并计算唯一的结果。我想你需要答案,因此无法避免。非常感谢你的回答。Marlin在创建索引后,我尝试了3号和4号。对于数字3,我得到的结果是:52,33秒对于数字4,我得到的结果是:49.17秒InnoDB


像那样使用它执行得更快。我是这样做的,就像你说的那样。@RiggsFolly你只使用故事和表1中的数据,为什么所有其他的连接?内部联接可能会减少数量(只计算那些具有相关记录的记录)。是的,exaclty@AkinaThe distinct count是一个非常缓慢的操作。数据库必须对结果进行排序并计算唯一的结果。我想你需要答案,因此无法避免。非常感谢你的回答。Marlin在创建索引后,我尝试了3号和4号。对于数字3,我得到的结果是:52,33秒对于数字4,我得到的结果是:49.17秒InnoDB不保留记录计数,即使在最简单的情况下也是如此。
ON
子句相当于
WHERE
子句用于
JOIN
。(对于
左/右连接
,它们是不同的)对于人类可读性,上的
应该说明表如何“关联”,而
中的
应该指定过滤。@RickJames
上的
子句相当于
中的
”,您在结果上是正确的。但是,OP将条件移动到
ON
子句中,时间得到了改进。是的,一个完美的优化器会以同样的、最快的方式完成这些工作。不同计数是一个非常缓慢的操作。数据库必须对结果进行排序并计算唯一的结果。我想你需要答案,因此无法避免。非常感谢你的回答。Marlin在创建索引后,我尝试了3号和4号。对于数字3,我得到的结果是:52,33秒对于数字4,我得到的结果是:49.17秒InnoDB不保留记录计数,即使在最简单的情况下也是如此。
ON
子句相当于
WHERE
子句用于
JOIN
。(对于
左/右连接
,它们是不同的)对于人类可读性,
上的
应该说明表如何“关联”,而
中的
应该指定过滤。@RickJames
上的
子句相当于
中的
”,您在结果上是正确的。但是,OP将条件移动到
ON
子句中,时间得到了改进。是的,一个完美的优化器会以同样和最快的方式完成这些。你甚至需要
EXISTS()
子句吗?你甚至需要
EXISTS()
子句吗?
SELECT count(stories.id), count(distinct table_1.table_2_id), count(distinct table_1.id)
FROM stories
    INNER JOIN table_1 ON (table_1.id = stories.table_1_id)
    INNER JOIN table_2 ON (table_2.id = table_1.table_2_id)
    INNER JOIN table_3 ON (table_3.id = table_2.table_3_id)
    INNER JOIN table_4 ON (table_4.id = table_3.table_4_id)
    INNER JOIN table_5 ON (table_5.id = table_4.table_5_id)
WHERE stories.id in (select s2.id
                    from stories s2
                    where s2.published_at between '2015-01-01' and '2020-02-21'
                    and s2.deleted = false
                    )
CREATE INDEX stories_deleted_published_at ON stories(deleted, published_at);
SELECT count(*) from stories;
SELECT count(stories.id), count(distinct table_1.table_2_id), count(distinct table_1.id)
FROM stories
    INNER JOIN table_1 ON (table_1.id = stories.table_1_id)
    INNER JOIN table_2 ON (table_2.id = table_1.table_2_id)
    INNER JOIN table_3 ON (table_3.id = table_2.table_3_id)
    INNER JOIN table_4 ON (table_4.id = table_3.table_4_id)
                          AND table_4.table_5_id IS NOT NULL
WHERE stories.id in (select s2.id
                from stories s2
                where s2.published_at between '2015-01-01' and '2020-02-21'
                and s2.deleted = false
                )
SELECT count(stories.id), count(distinct table_1.table_2_id), count(distinct table_1.id)
FROM stories
    INNER JOIN table_1 ON (table_1.id = stories.table_1_id)
                          AND stories.published_at between '2015-01-01' and '2020-02-21'
                          AND stories.deleted = false
    INNER JOIN table_2 ON (table_2.id = table_1.table_2_id)
    INNER JOIN table_3 ON (table_3.id = table_2.table_3_id)
    INNER JOIN table_4 ON (table_4.id = table_3.table_4_id)
                          AND table_4.table_5_id IS NOT NULL
SELECT  count(*),
        count(distinct table_1.table_2_id),
        count(distinct table_1.id)
    FROM stories AS s
    JOIN table_1 ON (table_1.id = stories.table_1_id)
    JOIN table_2 ON (table_2.id = table_1.table_2_id)
    WHERE s.published_at >= '2015-01-01'
      AND s.published_at  < '2015-01-01' + INTERVAL 3 WEEK
      AND s.deleted = FALSE
      AND EXISTS( SELECT 1
                     FROM table_3 ON (table_3.id = table_2.table_3_id)
                     JOIN table_4 ON (table_4.id = table_3.table_4_id)
                     JOIN table_5 ON (table_5.id = table_4.table_5_id) );