【问题标题】:Find total records in various tables in a single query在单个查询中查找各种表中的总记录
【发布时间】:2016-03-28 16:59:10
【问题描述】:

目前我正在使用这个查询,是否有任何替代这个查询,这样会更快。

SELECT 
    SUM(result1),
    SUM(result2),
    SUM(result3)
FROM (
    (
        SELECT 
            0 as result1,0 as result2,COUNT(*) as result3
        FROM 
            table1
    )
    UNION
    (
        SELECT 
            count(*) as result1,0 as result2,0 as result3
        FROM 
         table2
    )
    UNION
    (
        SELECT 
            0 as result1,count(*) as result2,0 as result3
        FROM 
            table3
    )
    ) as allresult

【问题讨论】:

    标签: mysql sql select count union


    【解决方案1】:

    上述查询的替代解决方案如下:

    SELECT (SELECT COUNT(1) FROM table2) AS result1, 
           (SELECT COUNT(1) FROM table3) AS result2, 
           (SELECT COUNT(1) FROM table1) AS result3;
    

    【讨论】:

    • 两个查询将同时执行
    • 感谢您的回答,但两个查询都需要相同的时间
    【解决方案2】:

    WHERE clause 中添加表名并执行以下查询:

    SELECT 
        T.Name AS TableName,
        S.Row_count AS RecordsCount
    FROM 
        sys.dm_db_partition_stats S
    INNER JOIN sys.tables T ON T.object_id = S.object_id
    Where 
        Object_Name(S.Object_Id) IN ('Employees','Country')
    

    【讨论】:

    • Givinig 错误:表 'sys.dm_db_partition_stats' 不存在。
    • @nitishkoundade,上述查询将在 MS SQL 环境中工作。你用的是什么数据库?
    • 数据库是 MySQL 5.5
    • @nitishkoundade,上述查询将在 MS SQL 环境中工作。我错过了 MySQL 标签。
    • 要在 MySQL 中做这样的事情,它应该是SELECT table_rows FROM information_schema.tables WHERE table_schema = 'name_of_database' AND table_name IN ('table1', 'table2', 'table3')。不过,我不确定 MySQL 更新这些统计信息的频率。
    【解决方案3】:

    从这个查询中减少一些性能负载的非常简单的方法:

    使用 UNION ALL 代替 UNION。如果有任何重复项,则 UNION ALL 将返回重复项,但唯一的区别与您正在使用的方式(只是 UNION)是 UNION 以降低性能为代价删除这些重复项。换句话说,它会执行 UNION ALL,然后返回并删除重复的条目。

    它应该会提高您的查询性能

    【讨论】:

    • 一般来说你是对的。但在这种情况下,只需要检查三行是否有重复项。
    【解决方案4】:

    (从this answer复制我的评论)

    您可以从INFORMATION_SCHEMA 获取表的行数,如下所示(但请参阅下面的警告):

    SELECT table_rows 
    FROM information_schema.tables
    WHERE table_schema = DATABASE() 
    AND table_name IN ('table1', 'table2', 'table3');
    

    但是MySQL documentation 指出这些值对于 InnoDb 表精确:“对于 InnoDB 表,行数只是 SQL 优化中使用的粗略估计。(如果InnoDB 表已分区。)”。如果您使用的是 MyISAM,这种方法可能就足够了。

    【讨论】:

      猜你喜欢
      • 2017-11-11
      • 2021-06-02
      • 1970-01-01
      • 1970-01-01
      • 2020-06-14
      • 1970-01-01
      • 2021-04-11
      • 2015-05-30
      • 2012-08-16
      相关资源
      最近更新 更多