MySQL如何查询所有列的唯一值计数与空值占比?有无类似pg_stats的系统表?
MySQL列级统计信息查询方案
MySQL存在和PostgreSQL pg_stats功能类似的系统统计表,可以快速获取近似的空值计数、唯一值计数,不需要逐列手写COUNT(DISTINCT)查询。
1. 8.0及以上版本原生支持
MySQL 8.0新增了INFORMATION_SCHEMA.COLUMN_STATISTICS系统表,存储了所有列的统计信息,对应字段如下:
- 空值计数:通过histogram字段的
null-count属性获取,对应pg_stats的null_frac * 总行数 - 唯一值计数:通过histogram字段的
distinct-values属性获取,对应pg_stats的n_distinct
针对你提供的employees表,查询语句如下:
-- 先更新统计信息,确保数据最新 ANALYZE TABLE employees; -- 查询列级统计结果 SELECT column_name, JSON_UNQUOTE(JSON_EXTRACT(histogram, '$.\"null-count\"')) AS num_null, JSON_UNQUOTE(JSON_EXTRACT(histogram, '$.\"distinct-values\"')) AS num_of_distinct FROM information_schema.column_statistics WHERE table_schema = '你的数据库名' AND table_name = 'employees';
返回的结果和你用PostgreSQL pg_stats查询的结果基本一致,属于近似统计值,误差在可接受范围内,适合快速做数据探查。
2. 低版本MySQL兼容方案
如果你使用的是MySQL 5.7及更低版本,没有COLUMN_STATISTICS表,可以用以下SQL批量生成所有列的统计查询语句,一次性执行即可拿到所有列的精确统计结果,不需要逐列手写:
-- 生成批量查询SQL SELECT CONCAT( 'SELECT ''', COLUMN_NAME, ''' AS column_name, ', 'COUNT(DISTINCT `', COLUMN_NAME, '`) AS num_of_distinct, ', 'SUM(`', COLUMN_NAME, '` IS NULL) AS num_null ', 'FROM `', TABLE_NAME, '` UNION ALL' ) AS exec_sql FROM information_schema.columns WHERE table_schema = '你的数据库名' AND table_name = 'employees';
将生成的SQL语句末尾的UNION ALL删除后执行,就能一次性拿到所有列的精确统计结果。
内容的提问来源于stack exchange,提问作者zshandy
相关产品推荐
相关产品推荐

