테이블, 인덱스가 사용하는 공간을 분석하는 방법

테이블, 인덱스가 사용하는 공간을 분석하는 방법

우리는 지난 한 해 동안 유기적으로 성장한 데이터베이스를 보유하고 있습니다. 각 테이블이 사용하는 공간을 어떻게 빠르게 분석할 수 있나요? 우리는 인덱스도 고려하고 싶습니다.

답변1

내 데이터베이스에서 innodb 테이블을 사용할 때 나는 다음을 사용하고 싶습니다.innodb_file_per_table환경. 이를 통해 혼돈과 같은 ls에서 무슨 일이 일어나고 있는지 빠르게 알 수 있습니다.제안됨.

이 진술은 귀하가 얼마나 많은 공간을 사용하고 있는지에 대한 좋은 정보를 제공할 수 있습니다.

use information_schema;
SELECT `TABLE_SCHEMA`, `TABLE_NAME`, `TABLE_ROWS`, `DATA_LENGTH`, 
       `INDEX_LENGTH`, `DATA_FREE` FROM `TABLES`

답변2

당신이 사용할 몇 가지 이상한 쿼리가 있습니까? 나는 이 글을 2년 전에 썼고 오늘날에도 여전히 사용하고 있습니다. 한번 시도해 보세요 !!!

다음은 모든 스토리지 엔진의 모든 데이터를 요약하는 쿼리입니다.

SELECT IFNULL(B.engine,'Total') "Storage Engine",
CONCAT(LPAD(REPLACE(FORMAT(B.DSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Data Size", CONCAT(LPAD(REPLACE(FORMAT(
B.ISize/POWER(1024,pw),3),',',''),17,' '),' ',SUBSTR(' KMGTP',pw+1,1),
'B') "Index Size", CONCAT(LPAD(REPLACE(FORMAT(B.TSize/POWER(1024,pw),3),',',''),
17,' '),' ',SUBSTR(' KMGTP',pw+1,1),'B') "Table Size"
FROM (SELECT engine,SUM(data_length) DSize,SUM(index_length) ISize,
SUM(data_length+index_length) TSize FROM information_schema.tables
WHERE table_schema NOT IN ('mysql','information_schema') AND
engine IS NOT NULL GROUP BY engine WITH ROLLUP) B,
(SELECT 3 pw) A ORDER BY TSize;

다음은 모든 데이터베이스의 모든 데이터를 요약하는 쿼리입니다.

SELECT DBName,CONCAT(LPAD(FORMAT(SDSize/POWER(1024,pw),3),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Data Size",CONCAT(LPAD(FORMAT(SXSize/
POWER(1024,pw),3),17,' '),' ',SUBSTR(' KMGTP',pw+1,1),'B') "Index Size",
CONCAT(LPAD(FORMAT(STSize/POWER(1024,pw),3),17,' '),' ',SUBSTR(' KMGTP',pw+1,1),
'B') "Total Size" FROM (SELECT IFNULL(DB,'All Databases') DBName,SUM(DSize) SDSize,
SUM(XSize) SXSize,SUM(TSize) STSize FROM (SELECT table_schema DB,
data_length DSize,index_length XSize,data_length+index_length TSize
FROM information_schema.tables WHERE table_schema NOT IN
('mysql','information_schema')) AAA GROUP BY DB WITH ROLLUP) AA,
(SELECT 3 pw) BB ORDER BY (SDSize+SXSize);

다음은 스토리지 엔진별로 그룹화된 모든 데이터베이스의 모든 데이터를 요약하는 쿼리입니다.

SELECT Statistic,DataSize "Data Size",IndexSize "Index Size",TableSize "Table Size"
FROM (SELECT IF(ISNULL(table_schema)=1,10,0) schema_score,
IF(ISNULL(engine)=1,10,0) engine_score,IF(ISNULL(table_schema)=1,
'ZZZZZZZZZZZZZZZZ',table_schema) schemaname,
IF(ISNULL(B.table_schema)+ISNULL(B.engine)=2,"Storage for All Databases",
IF(ISNULL(B.table_schema)+ISNULL(B.engine)=1,
CONCAT("Storage for ",B.table_schema),
CONCAT(B.engine," Tables for ",B.table_schema))) Statistic,
CONCAT(LPAD(REPLACE(FORMAT(B.DSize/POWER(1024,pw),3),',',''),17,' '),
' ',SUBSTR(' KMGTP',pw+1,1),'B') DataSize,CONCAT(LPAD(REPLACE(
FORMAT(B.ISize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') IndexSize,CONCAT(LPAD(REPLACE(FORMAT(B.TSize/
POWER(1024,pw),3),',',''),17,' '),' ',SUBSTR(' KMGTP',pw+1,1),'B') TableSize
FROM (SELECT table_schema,engine,SUM(data_length) DSize,SUM(index_length) ISize,
SUM(data_length+index_length) TSize FROM information_schema.tables
WHERE table_schema NOT IN ('mysql','information_schema') AND
engine IS NOT NULL GROUP BY table_schema,engine WITH ROLLUP) B,
(SELECT 3 pw) A) AA ORDER BY schemaname,schema_score,engine_score;

주의 사항: 이러한 모든 쿼리의 끝부분에는 다음과 같은 인라인 SELECT가 있다는 것을 알 수 있습니다.(SELECT 3 pw)

숫자 3을 사용하면 보고서가 GigaBytes로 표시됩니다.
실제로 여기에 사용되는 보고서의 숫자와 단위 목록이 있습니다.

  • (SELECT 0 pw)보고서(바이트)
  • (SELECT 1 pw)킬로바이트 단위의 보고서
  • (SELECT 2 pw)메가바이트 단위의 보고서
  • (SELECT 3 pw)기가바이트 단위의 보고서
  • (SELECT 4 pw)테라바이트 단위의 보고서
  • (SELECT 5 pw)페타바이트 단위의 보고서(이 설정을 사용한 적이 없지만 언젠가 해당 수치에 도달할 경우를 대비해 사용 가능)

즐기다 !!!

답변3

MySQL에는 몇 가지 기능이 내장되어 있습니다.

use <datbase name>;
show table status;

답변4

읽기 쉬운 형식으로 MySQL 인스턴스를 보려면 다음과 같은 도구를 사용해 보십시오.http://www.aquafold.com/index-mysql.html

관련 정보