gpt4 book ai didi

mysql - MAX() 是否可以提高查询性能?

转载 作者:行者123 更新时间:2023-11-29 13:43:11 25 4
gpt4 key购买 nike

在这篇文章中:SQL Query to get the data .

第一个答案是:

SELECT students.student_id,student_name,father_name,mother_name,
COUNT(student_addresses.student_id) AS total_addresses,
COUNT(student_phones.student_id) AS total_phones
FROM students,student_phones,student_addresses
WHERE students.student_id = student_phones.student_id AND
students.student_id = student_addresses.student_id AND
students.student_id = 7
GROUP BY BY students.student_id,student_name,father_name,mother_name;

而第二个是:

SELECT s.student_id,
max(s.student_name) student_name,
max(s.father_name) father_name,
max(s.mother_name) mother_name,
COUNT(distinct a.student_address_id) total_addresses,
COUNT(distinct p.student_phone_id) total_phones
FROM students s
LEFT JOIN student_phones p ON s.student_id = p.student_id
LEFT JOIN student_addresses a ON s.student_id = a.student_id
WHERE s.student_id = 7
GROUP BY s.student_id

现在的问题是:在性能方面,两个查询之间是否存在显着差异?使用 MAX() 是否会影响第二个查询的执行时间?

我尝试用谷歌搜索答案,但没有成功。我想要对此有一个清晰而具体的解释。

最佳答案

即使四列都是唯一的(students.student_idstudent_namefather_name),这两个查询也没有执行相同的操作,mother_name)。

从逻辑角度来看,这两个查询并不相同。第一个不会为没有电话或没有地址的学生返回任何行。第二个将返回这样的学生。此外,计数值也不同(取决于数据)。

从性能角度来看,主要区别是:

       COUNT(student_addresses.student_id) AS total_addresses,    
COUNT(student_phones.student_id) AS total_phones

对比:

       COUNT(distinct student_addresses.student_id) AS total_addresses,    
COUNT(distinct student_phones.student_id) AS total_phones

使用 count(distinct) 的成本更高,因为 SQL 引擎必须维护所有值的列表。在极端情况下,这些值可能会超出内存,甚至导致更多的 I/O 操作。对于 count(),引擎只是将数字加一,而不是执行繁琐的列表操作。

同样,min()max() 的开销也很小——引擎会进行比较并覆盖值。这是一小部分额外工作,不太可能影响性能。平衡这一点的是 group by 键更短。较短的 key 可能会对性能产生影响,具体取决于所使用的底层算法。无论如何,group by 处理的两个查询的数据量相同,因此 key 长度的总体差异(无论算法如何)可能很小。

简而言之,任何性能差异都是由于 count(distinct) 而不是 max() 造成的。您应该决定这是否是您真正需要的,并据此编写查询。第二种形式更好,因为它使用 ANSI 标准连接语法。

关于mysql - MAX() 是否可以提高查询性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17807078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com