2017-12-29 40 views
0

에 대한 크기, num_tables, default_charset, default_collation : 캐릭터 세트를 추가하는 방법을 알아 내기 위해쿼리 NUM_ROWS, 모든 데이터베이스 지금 나는이 가지고 올 수있었습니다

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_NAMEDEFAULT_COLLATION_NAME 개의 컬럼을 가지고 있다는 것을 알아 냈습니다. 위의 쿼리에이 정보를 추가하고 싶습니다. 또한, 크기에 따라 Kb 또는 MB로 db 크기를 표시하는 쉬운 방법이 있는지 여부를 알고 싶습니다 (예 : heidiSQL 요약과 같이).

추측이 내 첫 번째 쿼리의에 의해 SCHEMA_NAME을 사용하여이 두 테이블 만 그룹 간의 조인의 일종을해야하는 것은 나를 혼란 :/

+1

데이터베이스의 charset 및 데이터 정렬은 _by default_를 제외한 테이블의 설정을 제어하지 않습니다. 표 설정과 열 설정 비교. 그래서, 나는 당신이 요구 한 것에 대한 유용성에 의문을 제기합니다. 또 다른 접근 방법은'... GROUP_CONCAT (DISTINCT character_set) ... FROM COLUMNS ...'이것은 각 데이터베이스에 대해 현재 사용중인 모든 문자셋을 표시합니다. 기본 설정을 사용할지 또는 사용중인 설정을 사용할지 여부를 명확히하십시오. (예,'JOIN'이 필요할 것 같습니다.) –

+0

@RickJames 실제로 제가 좋은 점은 제가 실제로 여기에서 달성하고자하는 것은 제 서버의 모든 데이터베이스에 대한 최대 관련 정보를 보여주는 것입니다 ~ 상자 당 20db 피팅 작은 공간 (1 또는 2 cmd 프롬프트 페이지 그래서 나는 모든 정보를 한 번에 볼 수 있습니다). 현재 각 데이터베이스에 사용중인 모든 문자 집합을 표시하는 것이 더 좋은 아이디어처럼 들리 겠지만 내 쿼리에 추가하기가 너무 어려울까요? 당신이 볼 수 있듯이 내 SQL 기술은 거의 녹슨 것들이며, 결국 따라 잡을 필요가있다 : D – BPL

답변

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); 

는 (사용자가 name_dbtable_schema 혼동하는 몇 가지 가능성이있다. 하나가 다른 별명이기 때문에, 두 일부가지 경우에 교환 할 수있다.)

당신은 할 수 있습니다 끝에 ORDER BY name_db을 붙이십시오. `WHERE TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema')라고 말하면 시스템 테이블을 피할 수있다.

table_rows은 InnoDB의 경우에 근사합니다.

+0

와우,이 쿼리는 훌륭한 것이다! 좋은 현상금과 많은 상향 증의 가치가 있습니다. 그것은 당신이 SQL 전문가라고 생각합니다. 확실히 이런 식으로 생각하지 않았을 것입니다. 높은 품질의 콘텐츠이기 때문에 더 많은 사람들이 답변을 포기할 것입니다. Tyvm. – BPL

+0

칭찬에 감사드립니다. 그것은 나에게 어느 정도 걸렸다. 보너스로 몇 가지 메모를 추가했습니다. –