web-dev-qa-db-ja.com

MyISAMとInnoDBはHDスペースをどのように利用しますか?

MySQLサーバーのHD容量が不足しています。私の大きなテーブルのほとんどは、InnoDBエンジンを使用しています(ミッションクリティカルな理由はありません)。恐ろしい 'dropデータベースがinnodb disk-space' 応答を回復するのを回避するために、私はより良くしたいと思います2つのエンジンがどのようにデータをディスクに保存するかを理解します。

  1. MyISAMを使用した場合、行を削除することでディスク領域をより簡単に回復できますか?削除/切り捨て/空のクエリに加えて実行する必要のあるコマンドはありますか?
  2. #1が真であると仮定すると、既存のInnoDBテーブルをMyISAMに変換し、その方法でスペースを回復することは可能/実現可能でしょうか?
7
Mike B

DiskSpaceのMySQLの使用はかなり予測可能です。

Information_schemaは、両方のストレージエンジンで使用されているスペースの量をすばやく提供できます。ただし、innodb_file_per_tableを使用してInnoDBを構成する方がはるかに優れていますこのようにして、個々のInnoDBテーブルのディスクスペースを細かく管理できます。 innodb_file_per_tableがない場合、ibdata1は大きくなり、決して縮小しません。

私はInnoDBのクリーンアップに関する素晴らしい記事を一度だけ書きました。

MyISAMについては、次のいずれかを定期的に実行する必要があります。

  • _OPTIMIZE TABLE myisam-tablename_;
  • _ALTER TABLE myisam-tablename ENGINE=MyISAM; ANALYZE TABLE myisam-tablename_;

これらはMyISAMを圧縮して、MyISAMテーブルコンポーネント(.MYDおよび.MYI)に未使用のデータとインデックスページがないようにします。

このクエリを使用して、ディスク容量の使用状況を手動で監視できます。

_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','performance_schema') AND engine IS NOT NULL GROUP BY engine WITH ROLLUP) B,(SELECT 3 pw) A ORDER BY TSize;
_

これにより、エンジンストレージエンジンのデータとインデックスが占めるスペースの量がわかります。クエリの最後に次の句があることに注意してください:(SELECT 3pw)。数値を変更して、異なる単位でレポートを生成します

_(SELECT 0 pw) for Bytes
(SELECT 1 pw) for KiloBytes
(SELECT 2 pw) for MegaBytes
(SELECT 3 pw) for GigaBytes
(SELECT 4 pw) for TeraBytes
(SELECT 5 pw) for PetaBytes (Write me if you every get numbers this high)
_

PDATE 2012-05-26 22:29 EDT

InnoDBに関して言えば、innodb_file_per_tableを使用する場合、_.ibd_ファイルのファイルサイズとdata_length + index_lengthの合計の間に違いがあることに気付くでしょう。

InnoDBテーブル_mydb.mytable_の場合、次の比較を行う必要があります。

  • _ls -l /var/lib/mysql/mydb/mytable.ibd | awk '{print %5}'_を実行してファイルのサイズを取得します
  • 情報スキーマの観点からテーブルのサイズを取得します:_SELECT data_length+index_length FROM information_schema.tables WHERE table_schema='mydb' AND table_name='mytable';_
  • filesize > (data_length+index_length) * 1.1の場合は、次のようにテーブルをドラッグする必要があります:_ALTER TABLE mydb.mytable ENGINE=InnoDB;_

これにより、一時テーブルが作成され、実際のデータページとインデックスページのみが一時テーブルにコピーされ、元のテーブルが削除され、一時テーブルの名前がmydb.mytableに戻されます。 1つのコマンドによるインスタントテーブル圧縮。営業時間外にすべてのテーブル圧縮を計画してください。

12
RolandoMySQLDBA

MyISAMは、実際に使用されているスペースを反映してディスクに割り当てます。外部キー、トランザクション、またはInnoDBに固有のその他の機能を使用していない場合は、MyISAMに簡単に変換できます。 InnoDBは書き込みが速く、MyISAMは読み取りが速くなります。最終的には、ストレージエンジンを任意に変更する前に、エンジン間の違いを詳細に調査することをお勧めします。

これは、過去にInnoDBテーブルスペースを解放するために使用した手順です。

mysql innodbから大量のデータを削除する

3
Warner