web-dev-qa-db-ja.com

OPTIMIZE TABLEはデータに影響を与えますか?

かなり遅くなっているデータベースに問題があります。 phpMyAdminのアナライザーは、テーブルでOPTIMIZE TABLEを実行することをお勧めします。

しかし、そうする前に、(もちろん)テーブル内のデータに起こり得る何かがあるかどうか、またはこの操作が完全に無害かどうかを知りたいと思います。

OPTIMIZE TABLEを使用するときに考慮すべき長所と短所はありますか?インデックスと主キーは同じままですか?最適化後に遅くなるデータベースの領域はありますか?

OPTIMIZE TABLE 基本的に3つのことを行います

  1. データページを縮小します
  2. インデックスページを縮小する
  3. 新しいインデックス統計を計算します

概念的には、OPTIMIZE TABLEmydb.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
  • datadirは/var/lib/mysql

ストレージエンジンの詳細を見てみましょう

MyISAM

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にコピーします。これにより、どちらのファイルでも断片化されたページがなくなります。

InnoDB

考慮すべき2つの視点があります。

視点#1: innodb_file_per_table 無効

innodb_file_per_table を無効にすると、すべてのInnoDBテーブルのすべてのデータページとインデックスページがシステムテーブルスペース内に格納されます(ファイルibdata1として知られています)。

Ibdata1に格納されているInnoDBテーブルでOPTIMIZE TABLEを実行すると、すべてのデータページとインデックスページが連続して書き込まれるため、テーブルのすべてのページが一緒になります。悪いニュースは、ibdata1が急速に成長することです。

視点#2: innodb_file_per_table 有効

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ファイルの圧縮につながる概念的な手順が実行されます。

私は以前にこれについて書いた

さて、元の質問について...

しかし、そうする前に、(もちろん)テーブル内のデータに起こり得る何かがあるかどうか、またはこの操作が完全に無害かどうかを知りたいと思います。

先ほど、両方のストレージエンジンでOPTIMIZE TABLEがどのように機能するかを説明しました。データとインデックスのサイズによっては、時間がかかる場合があります。地震または停電の外では、OPTIMIZE TABLEを実行してもデータに悪影響はなく、インデックスは再構築されます。

OPTIMIZE TABLEを使用するときに考慮すべき長所と短所はありますか?

同上

インデックスと主キーは同じままですか?

はい

最適化後に遅くなるデータベースの領域はありますか?

ありえない。断片化のないテーブルのクエリは、より速くなるだけです。

12
RolandoMySQLDBA

大きなテーブルでの最適化操作中にCtrl + Cを実行しないでください。数か月前(2017年後半)に、最適化の実行中にCtrl + Cを押すと、150 GBのMyISAM MySQLテーブルが破損しました。

1
Nazar