现在我已经能够想出这个:
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表有DEFAULT_CHARACTER_SET_NAME
和DEFAULT_COLLATION_NAME
列,我想将这些列添加到上面的查询中。此外,我想知道是否有任何简单的方法来显示数据库大小(Kb或MB),具体取决于大小(例如:像heidiSQL摘要一样)。
猜猜我需要使用SCHEMA_NAME
在这两个表之间进行某种联接,但是我的第一个查询的分组让我困惑:/
答案 0 :(得分:2)
事实证明最好分别为所需的两个表中的每个表进行聚合和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
vs name_db
可能会让用户感到困惑。由于其中一个是另一个的别名,因此两者在某些案例中可以互换。 )
您可能希望最后添加ORDER BY name_db
。你可能想说'WHERE TABLE_SCHEMA NOT IN(' mysql',' information_schema',' performance_schema')以避免系统表。
请注意,table_rows
仅为InnoDB的近似值。