查询所有数据库的 num_rows、大小、num_tables、default_charset、default_collation
Query num_rows, size, num_tables, default_charset, default_collation for all databases
现在我已经想到了这个:
SELECT
table_schema AS 'name_db',
sum(table_rows) AS 'num_rows_db',
SUM(data_length + index_length) / 1024 / 1024 AS 'size_db(MB)',
count(*) as 'num_tables_db'
FROM
information_schema.TABLES
GROUP BY table_schema;
现在我想知道如何为所有数据库添加字符集和排序规则,但我不确定该怎么做。
我发现 information_schema.SCHEMATA table 有 DEFAULT_CHARACTER_SET_NAME
和 DEFAULT_COLLATION_NAME
列,我想将它们添加到我的上述查询中。另外,我想知道是否有任何简单的方法可以根据大小显示以 Kb 或 MB 为单位的数据库大小(即:像 heidiSQL 摘要那样)。
我想我需要使用 SCHEMA_NAME
在这 2 个 table 之间进行某种连接,但是我的第一个查询的分组依据让我感到困惑:/
事实证明,最好对所需的两个表分别进行聚合和 GROUP BY
。
SELECT *
FROM
(
SELECT table_schema AS 'name_db',
sum(table_rows) AS 'num_rows_db',
IF(SUM(data_length + index_length) > 1048576,
CONCAT(ROUND(SUM(data_length + index_length) / 1024 / 1024), ' MB'),
CONCAT(ROUND(SUM(data_length + index_length) / 1024), ' KB') ) AS 'size_db',
count(*) as 'num_tables_db'
FROM information_schema.TABLES AS t
GROUP BY TABLE_SCHEMA
) AS t
JOIN
(
SELECT table_schema AS 'name_db',
GROUP_CONCAT(DISTINCT CHARACTER_SET_NAME) AS charsets,
GROUP_CONCAT(DISTINCT COLLATION_NAME) AS collations
FROM information_schema.COLUMNS
GROUP BY TABLE_SCHEMA
) AS c USING (name_db);
(用户可能会被 table_schema
与 name_db
混淆。由于一个是另一个的别名,因此两者在 some 例。)
您可能想在最后添加 ORDER BY name_db
。您可能想说`WHERE TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema') 以避免系统表。
请注意,table_rows
仅在 InnoDB 的情况下是近似值。
现在我已经想到了这个:
SELECT
table_schema AS 'name_db',
sum(table_rows) AS 'num_rows_db',
SUM(data_length + index_length) / 1024 / 1024 AS 'size_db(MB)',
count(*) as 'num_tables_db'
FROM
information_schema.TABLES
GROUP BY table_schema;
现在我想知道如何为所有数据库添加字符集和排序规则,但我不确定该怎么做。
我发现 information_schema.SCHEMATA table 有 DEFAULT_CHARACTER_SET_NAME
和 DEFAULT_COLLATION_NAME
列,我想将它们添加到我的上述查询中。另外,我想知道是否有任何简单的方法可以根据大小显示以 Kb 或 MB 为单位的数据库大小(即:像 heidiSQL 摘要那样)。
我想我需要使用 SCHEMA_NAME
在这 2 个 table 之间进行某种连接,但是我的第一个查询的分组依据让我感到困惑:/
事实证明,最好对所需的两个表分别进行聚合和 GROUP BY
。
SELECT *
FROM
(
SELECT table_schema AS 'name_db',
sum(table_rows) AS 'num_rows_db',
IF(SUM(data_length + index_length) > 1048576,
CONCAT(ROUND(SUM(data_length + index_length) / 1024 / 1024), ' MB'),
CONCAT(ROUND(SUM(data_length + index_length) / 1024), ' KB') ) AS 'size_db',
count(*) as 'num_tables_db'
FROM information_schema.TABLES AS t
GROUP BY TABLE_SCHEMA
) AS t
JOIN
(
SELECT table_schema AS 'name_db',
GROUP_CONCAT(DISTINCT CHARACTER_SET_NAME) AS charsets,
GROUP_CONCAT(DISTINCT COLLATION_NAME) AS collations
FROM information_schema.COLUMNS
GROUP BY TABLE_SCHEMA
) AS c USING (name_db);
(用户可能会被 table_schema
与 name_db
混淆。由于一个是另一个的别名,因此两者在 some 例。)
您可能想在最后添加 ORDER BY name_db
。您可能想说`WHERE TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema') 以避免系统表。
请注意,table_rows
仅在 InnoDB 的情况下是近似值。