Mysql 查询中的条件速度

Mysql 查询中的条件速度,mysql,sql,Mysql,Sql,给定两个参数时,根据相同的数据得出相同的结果。在SELECT CASE WHEN处添加条件是否会使查询比将其放置在WHERE处更快 /*On SELECT*/ SELECT COUNT(*) as totaal, SUM(general_score_filter.dash) as totaal_score FROM ( SELECT operatie.id as op

给定两个参数时,根据相同的数据得出相同的结果。在SELECT CASE WHEN处添加条件是否会使查询比将其放置在WHERE处更快

/*On SELECT*/    
        SELECT
            COUNT(*) as totaal,
            SUM(general_score_filter.dash) as totaal_score
        FROM (
        SELECT 
            operatie.id as operatie_id,
            AVG(CASE WHEN patient.inactief = 0 AND vraag.eigenschap_id = _eigenschap_id THEN antwoord.score ELSE 0 END) AS dash
        FROM
        operatie
            LEFT JOIN antwoord ON operatie.id = antwoord.operatie_id AND antwoord.deleted = 0
            LEFT JOIN vraag ON vraag.id = antwoord.vraag_id AND vraag.deleted = 0
            LEFT JOIN patient ON operatie.patient_id = patient.id AND patient.inactief = 0
        GROUP BY operatie.id) AS general_score_filter;

/*On WHERE*/
        SELECT
            COUNT(*) as totaal,
            SUM(general_score_filter.dash) as totaal_score
        FROM (
        SELECT 
            operatie.id as operatie_id,
            AVG(CASE WHEN vraag.eigenschap_id = _eigenschap_id THEN antwoord.score ELSE 0 END) AS dash
        FROM
        operatie
            LEFT JOIN antwoord ON operatie.id = antwoord.operatie_id AND antwoord.deleted = 0
            LEFT JOIN vraag ON vraag.id = antwoord.vraag_id AND vraag.deleted = 0
            LEFT JOIN patient ON operatie.patient_id = patient.id AND patient.inactief = 0
        WHERE
            patient.inactief = 0
        GROUP BY operatie.id) AS general_score_filter;

这完全取决于您的数据量。您可能不会注意到50k-100k的小数据集,但如果有数百万行,您会注意到

但是总的来说,是的,在WHERE子句中使用一个关于不活动状态的索引会更快。根据下面的示例数据,您将跳过所有Inacticef=1记录,但其中一条记录对您的答案更准确。您想要所有人,还是只想要那些不活动EF=0的人。阅读下面的更多内容

示例,其中包含Operatie表中的以下记录

id    inactief      score (via the join to antwoord)
1     0             10
1     0             20
1     1             30
1     0             40
1     1             50
1     1             60
1     0             70
2     1             15
2     1             25
3     0             38
假设您的第一次查询,您的最终计数将包含所有3名患者1、2和3。您的第二个count where子句inactief=0将只返回2个患者1和3,因为患者2的所有记录都是inactief=1


此外,我同意否决投票。如果你对某件事有意见,并且投了反对票,至少告诉我是怎么回事,这样我以后可以更好地处理我的帖子。。。有些人只是喜欢粗鲁,但你能做什么。

你需要提供更多的背景。举一个你正在询问的问题的例子会有所帮助。CASE和WHERE执行不同的操作-一个更改列的值,另一个过滤行。所以你的问题的基础没有意义。在where子句中使用大小写表达式通常是个坏主意,因为它们更难优化。用户和/或结构。我更新了我的问题嗯,我只是问,我没有看到任何重复的问题。现在我得到了-2票。这些人怎么了?谢谢你,德拉普,这就是我要知道的。有时候事情看起来很简单,但人们只是想把它们复杂化:@JuanNguyen,一个800k声誉的人的评论无法理解你想要澄清什么?我想我做得很好:哦,在我添加一个例子之前,他只是留下了一条评论。但是他没有回来