かなり遅くなっているデータベースに問題があります。 phpMyAdminのアナライザーは、テーブルでOPTIMIZE TABLE
を実行することをお勧めします。
しかし、そうする前に、(もちろん)テーブル内のデータに起こり得る何かがあるかどうか、またはこの操作が完全に無害かどうかを知りたいと思います。
OPTIMIZE TABLE
を使用するときに考慮すべき長所と短所はありますか?インデックスと主キーは同じままですか?最適化後に遅くなるデータベースの領域はありますか?
OPTIMIZE TABLE 基本的に3つのことを行います
概念的には、OPTIMIZE TABLE
はmydb.mytable
で次のように動作します
USE mydb
CREATE TABLE mytabletmp LIKE mytable;
INSERT INTO mytabletmp SELECT * FROM mytable;
ALTER TABLE mytable RENAME mytablezap;
ALTER TABLE mytabletmp RENAME mytable;
DROP TABLE mytablezap;
ANALYZE TABLE mytable;
ただし、
mydb.mytable
/var/lib/mysql
ストレージエンジンの詳細を見てみましょう
MyISAMテーブルmydb.mytable
は、物理的に3つのファイルに格納されています
/var/lib/mysql/mydb/mytable.frm
(テーブル構造)/var/lib/mysql/mydb/mytable.MYD
(データ)/var/lib/mysql/mydb/mytable.MYI
(インデックス)OPTIMIZE TABLEの実行に関する概念的な説明では、データページとインデックスページを新しい.MYD
と.MYI
にコピーします。これにより、どちらのファイルでも断片化されたページがなくなります。
考慮すべき2つの視点があります。
innodb_file_per_table を無効にすると、すべてのInnoDBテーブルのすべてのデータページとインデックスページがシステムテーブルスペース内に格納されます(ファイルibdata1として知られています)。
Ibdata1に格納されているInnoDBテーブルでOPTIMIZE TABLE
を実行すると、すべてのデータページとインデックスページが連続して書き込まれるため、テーブルのすべてのページが一緒になります。悪いニュースは、ibdata1が急速に成長することです。
innodb_file_per_table を有効にすると、すべてのInnoDBテーブルのすべてのデータページとインデックスページがibdata1の外部に格納されます。 mydb.mytable
の物理ストレージは次のとおりです:
/var/lib/mysql/mydb/mytable.frm
(テーブル構造)/var/lib/mysql/mydb/mytable.ibd
(データとインデックス)Ibdata1(システムテーブルスペース)の外部に格納されているInnoDBテーブルでOPTIMIZE TABLE
を実行すると、.ibd
ファイルの圧縮につながる概念的な手順が実行されます。
私は以前にこれについて書いた
Oct 29, 2010
: 方法:mysql InnoDBストレージエンジンをクリーンアップしますか?(StackOverflow)Mar 25, 2012
: なぜInnoDBはすべてのデータベースを1つのファイルに格納するのですか?Apr 11, 2012
: InnoDBテーブルから断片化をどのように削除しますか?Dec 21, 2012
: OPTIMIZE TABLEの進行状況を示す進行状況インジケーターはありますか?Jan 07, 2013
: データベース領域がibdata1のサイズと一致しませんしかし、そうする前に、(もちろん)テーブル内のデータに起こり得る何かがあるかどうか、またはこの操作が完全に無害かどうかを知りたいと思います。
先ほど、両方のストレージエンジンでOPTIMIZE TABLEがどのように機能するかを説明しました。データとインデックスのサイズによっては、時間がかかる場合があります。地震または停電の外では、OPTIMIZE TABLEを実行してもデータに悪影響はなく、インデックスは再構築されます。
OPTIMIZE TABLEを使用するときに考慮すべき長所と短所はありますか?
同上
インデックスと主キーは同じままですか?
はい
最適化後に遅くなるデータベースの領域はありますか?
ありえない。断片化のないテーブルのクエリは、より速くなるだけです。
大きなテーブルでの最適化操作中にCtrl + Cを実行しないでください。数か月前(2017年後半)に、最適化の実行中にCtrl + Cを押すと、150 GBのMyISAM MySQLテーブルが破損しました。