MySQL一次计算多个列或单独的事务

MySQL一次计算多个列或单独的事务,mysql,Mysql,我有一个每日cron,它统计特定列的非null和非空字符串行数,例如: SELECT count(first_name) FROM users WHERE first_name IS NOT NULL and first_name IS != '' SELECT count(last_name) FROM users WHERE last_name IS NOT NULL and first_name IS != '' 如果我在一个MySQL调用中这样做,性能会得到提高吗 对1个查询使用CAS

我有一个每日cron,它统计特定列的非null和非空字符串行数,例如:

SELECT count(first_name) FROM users WHERE first_name IS NOT NULL and first_name IS != ''
SELECT count(last_name) FROM users WHERE last_name IS NOT NULL and first_name IS != ''

如果我在一个MySQL调用中这样做,性能会得到提高吗

对1个查询使用CASE条件

SELECT SUM(CASE WHEN first_name IS NOT NULL and first_name != '' THEN 1 ELSE 0 END),
       SUM(CASE WHEN last_name IS NOT NULL and last_name != '' THEN 1 ELSE 0 END) FROM users

对1个查询使用CASE条件

SELECT SUM(CASE WHEN first_name IS NOT NULL and first_name != '' THEN 1 ELSE 0 END),
       SUM(CASE WHEN last_name IS NOT NULL and last_name != '' THEN 1 ELSE 0 END) FROM users

我相信这个问题已经足够了:

SELECT COUNT(DISTINCT first_name), COUNT(DISTINCT last_name) FROM users
正如其他开发人员指出的,这个
计数
甚至会计算
'
空值

我认为这是可以接受的。如果没有,您可以:

SELECT COUNT(DISTINCT first_name)-1, COUNT(DISTINCT last_name)-1 FROM users
这并不完全是您所需要的,但如果您确信您有那些空值可以工作:

如果您想要返回正确的
COUNT
的清晰查询,最好使用@Mihai query:

   SELECT SUM(CASE WHEN first_name IS NOT NULL and first_name != '' THEN 1 ELSE 0 END),
   SUM(CASE WHEN last_name IS NOT NULL and last_name != '' THEN 1 ELSE 0 END) FROM user

但是这个查询可以在大量记录上大大提高性能。

我相信这个查询就足够了:

SELECT COUNT(DISTINCT first_name), COUNT(DISTINCT last_name) FROM users
正如其他开发人员指出的,这个
计数
甚至会计算
'
空值

我认为这是可以接受的。如果没有,您可以:

SELECT COUNT(DISTINCT first_name)-1, COUNT(DISTINCT last_name)-1 FROM users
这并不完全是您所需要的,但如果您确信您有那些空值可以工作:

如果您想要返回正确的
COUNT
的清晰查询,最好使用@Mihai query:

   SELECT SUM(CASE WHEN first_name IS NOT NULL and first_name != '' THEN 1 ELSE 0 END),
   SUM(CASE WHEN last_name IS NOT NULL and last_name != '' THEN 1 ELSE 0 END) FROM user


但是这一个可以对大量记录的性能产生很大影响。

一次命中db比2次命中要好。
从用户中选择COUNT(不同的名字)、COUNT(不同的姓氏)
?@Alex:我想这可能包括xxx_name=''@EricJ的情况。是的,但在99%的情况下,我想这是可以接受的。如果没有-您可以添加
WHERE
,我想他在当前WHERE中有这个检查是有原因的。您如何将其添加到WHERE,并在所有情况下获得准确的计数,例如,对于用户“”、“琼斯”和“汤姆”、“”?点击一次数据库比点击两次要好。
从用户中选择计数(不同的名字)、计数(不同的姓氏)
?@Alex:我想这将包括xxx_name='@EricJ的情况。是的,但在99%的情况下,我想这是可以接受的。如果没有-您可以添加
WHERE
,我想他在当前WHERE中有这个检查是有原因的。您如何将其添加到WHERE并在所有情况下获得准确的计数,例如,对于用户“”、“Jones”和“Tom”、“”?我不确定这是否比运行2个查询快我认为选择计数(不同的……老实说,问题注释中的解决方案会比这个答案更好。很难看出2个查询比1个查询更快,特别是对于一个简单的条件。两次命中数据库就足够了already@Mihai我同意,我也会感到惊讶。单是两次往返的延迟就意味着一次查询的性能通常会超过两次。你的非常好尽管如此,我完全不知道SQL server通常会做些什么来优化这一点。我认为Shadow可能适用于数据库中有大量行的某些情况。@Michael作为一般“规则”一次查询更好。我同意,对于一个有数十亿行的复杂查询,更多的查询会更快,尤其是在存在并发问题的情况下。我还想对这两种情况进行解释@hank我不确定这是否比运行两次查询快我认为选择计数(不同的……老实说,问题注释中的解决方案会比这个答案更好。很难看出2个查询比1个查询更快,特别是对于一个简单的条件。两次命中数据库就足够了already@Mihai我同意,我也会感到惊讶。单是两次往返的延迟就意味着一次查询的性能通常会超过两次。你的非常好尽管如此,我完全不知道SQL server通常会做些什么来优化这一点。我认为Shadow可能适用于数据库中有大量行的某些情况。@Michael作为一般“规则”1 trip更好。我同意对于数十亿行的复杂查询,更多的查询会更快,特别是在存在并发问题的情况下。我还想解释这两种情况@HankCount distinct包含空格。如果不检查是否有空白值,你不能简单地执行-1。第三种查询已经被建议过了。@Shadow I已经看到您的评论。谢谢您的意见。Count distinct包括空格。如果不检查是否有空白值,您不能简单地执行-1。已经建议使用第三个值。@Shadow我已经看到您的评论。谢谢您的意见。