So analysieren Sie den von Tabellen und Indizes genutzten Speicherplatz

So analysieren Sie den von Tabellen und Indizes genutzten Speicherplatz

Wir haben eine Datenbank, die im letzten Jahr organisch gewachsen ist. Wie können wir den von jeder Tabelle belegten Speicherplatz schnell analysieren? Wir möchten auch die Indizes berücksichtigen.

Antwort1

Wenn ich InnoDB-Tabellen in meinen Datenbanken verwende, verwende ich gerne dieinnodb_datei_pro_tabelleEinstellung. Dadurch kann ich mir schnell ein Bild davon machen, was mit ls wie Chaos los istempfohlen.

Diese Aussage kann Ihnen eine recht gute Vorstellung davon geben, wie viel Speicherplatz Sie nutzen.

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

Antwort2

Ich habe ein paar verrückte Abfragen für Sie. Ich habe sie vor zwei Jahren geschrieben und verwende sie noch heute. Probieren Sie sie aus!!!

Hier ist eine Abfrage, um alle Daten aller Speicher-Engines zusammenzufassen

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;

Hier ist eine Abfrage, um alle Daten aus allen Datenbanken zusammenzufassen

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

Hier ist eine Abfrage, um alle Daten aller Datenbanken, gruppiert nach Speichermodul, zusammenzufassen.

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;

ACHTUNG: Sie werden feststellen, dass am Ende aller dieser Abfragen ein Inline-SELECT steht, das wie folgt aussieht:(SELECT 3 pw)

Die Zahl 3 bewirkt, dass der Bericht in Gigabyte ausgegeben wird.
Hier ist eine Liste der Zahlen und Einheiten des Berichts, die er verwendet:

  • (SELECT 0 pw)Berichte in Bytes
  • (SELECT 1 pw)Berichte in Kilobyte
  • (SELECT 2 pw)Berichte in Megabyte
  • (SELECT 3 pw)Berichte in Gigabyte
  • (SELECT 4 pw)Berichte in Terabyte
  • (SELECT 5 pw)Berichte in Petabyte (ich habe diese Einstellung nie verwendet, aber sie ist vorhanden, falls Sie diese Zahl irgendwann erreichen)

Genießen !!!

Antwort3

Mysql hat einige eingebaute Funktionalität

use <datbase name>;
show table status;

Antwort4

Versuchen Sie es mit einem Tool wie diesem, um Ihre MySQL-Instanz in einem leicht lesbaren Format anzuzeigen:http://www.aquafold.com/index-mysql.html

verwandte Informationen