查询所有数据库的num_rows,size,num_tables,default_charset,default_collat ion

问题描述 投票:0回答:1

现在我已经能够想到这个:

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;

现在我想弄清楚如何为所有数据库添加charset和collat​​ion,但我不知道该怎么做。

我已经想出了information_schema.SCHEMATA表有DEFAULT_CHARACTER_SET_NAMEDEFAULT_COLLATION_NAME列,我想将它们添加到我上面的查询中。此外,我想知道是否有任何简单的方法来显示数据库大小(Kb或MB),具体取决于大小(即:像heidiSQL摘要一样)。

猜猜我需要使用SCHEMA_NAME在这两个表之间进行某种连接,但我的第一个查询的组合让我困惑:/

mysql sql collation information-schema
1个回答
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_schemaname_db混淆。由于一个是另一个的别名,在某些情况下这两个是可以互换的。)

你可能想在最后处理ORDER BY name_db。你可能想说'WHERE TABLE_SCHEMA NOT IN('mysql','information_schema','performance_schema')来避免系统表。

请注意,table_rows仅在InnoDB的情况下是近似的。

© www.soinside.com 2019 - 2024. All rights reserved.