在单个查询中查找各种表中的总记录
Posted
技术标签:
【中文标题】在单个查询中查找各种表中的总记录【英文标题】: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
【问题讨论】:
【参考方案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,这种方法可能就足够了。
【讨论】:
以上是关于在单个查询中查找各种表中的总记录的主要内容,如果未能解决你的问题,请参考以下文章