インデックスの追加が非常に遅い…ETAを取得したり進捗を表示したりするmysqlコマンドはありますか?


13

現在、インデックスを追加するために、テーブル(20Mエントリ)でalterクエリを実行しています。すでに3日以上実行されています(「tmpテーブルへのコピー」でスタックします)。

クエリの進行状況を確認する方法はありますか、言い換えると、完了の推定時間を取得する方法はありますか?

ありがとう。


4
MyISAM?InnoDB?InnoDBの場合、テーブルごとのファイルはオンになっていますか?
チャールズ

素晴らしい質問-私が即座に考えることができる最高のことは、生の一時ファイルと実際のファイルのサイズを使用して大まかな推測をすることです-しかし、さらに研究を行います

してくださいSHOW CREATE TABLE tblname\Gテーブルの上に、私達にあなたがしたいのインデックスを教えてください。
-RolandoMySQLDBA

回答:


3

mysqlがテーブルを変更する場合、基本的にテーブルのコピーを作成してからコピーをスワップインします。この方法で更新を途中でキャンセルしても、テーブルは安定した状態のままです。したがって、mysqlデータディレクトリ(/ var / lib / mysql /?)を調べて、新しいファイルの大きさを確認できます。これはInnodbではもう少し難しいですが、どこかに作成されたtmpテーブルがあります。

ソートバッファー変数(myisam_sort_buffer_size、sort_buffer_size)を増やすことで、インデックスにかかる時間を大幅に短縮できます。あなたが持っているメモリでできる限り大きくします。変更時間を数日短縮することも、メモリの量に応じて数時間に短縮することもできます。約3時間で1億5000万件のレコードテーブルを作成しました。


残念ながら、tmpテーブルが見つかりませんでした。innodb_file_per_tableをOFFに設定して、innoDBを使用します。

2

innodb_fle_per_tableはOFFであるため、テーブルを表示して進行状況を測定することはできません。

MyISAMでこれを行う方法について、以前に投稿しました。InnoDB_file_per_tableが有効になっていて、InnoDBインフラストラクチャを再設計する場合にのみ、InnoDBに対してこれを行うことができます。問題のファイルのサイズをオペレーティングシステムで調べる必要があります。

InnoDBクリーンアップを完全に実装し、innodb_file_per_tableを有効にしたら、次のようにインデックスの更新を実行できます。

例は次のとおりです

  • datadirとして/ var / lib / mysqlを使用したMySQLインスタンス
  • db.lotsofdata2,000万の名前で呼び出されたInnoDBテーブル:

テーブルは次のようになります。

CREATE TABLE db.lotsofdata
(
    id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(30),
    PRIMARY KEY (id)
) ENGINE=InnoDB;

名前インデックスを作成するとします。あなたはこれを行うことができます:

CREATE TABLE db.lotsofdata_new LIKE db.lotsofdata;
ALTER TABLE db.lotsofdata_new ADD INDEX (name);
INSERT INTO db.lotsofdata_new SELECT * db.lotsofdata;
ALTER TABLE db.lotsofdata RENAME db.lotsofdata_old;
ALTER TABLE db.lotsofdata_new RENAME db.lotsofdata;
TRUNCATE TABLE db.lotsofdata_old;
ALTER TABLE db.lotsofdata_old ENGINE=InnoDB;
DROP TABLE db.lotsofdata_old;

INSERTの実行中に、オペレーティングシステムに移動してこれを実行します。

cd /var/lib/mysql/db
watch ls -l lotsofda*.ibd

これにより、現在のサイズのリストが表示されlotsofdata_new.ibdます。がを超えるとlotsofdata.ibd、完了に近づいていることがわかります。

BTW MariaDBには、内部で実装されたProgress Statusがあります


ご意見ありがとうございます。とりあえず、最後のmysqlバージョンにアップグレードした後、クエリを強制終了して再試行することにしました。うまくいけば、そのようにスムーズに行くでしょう。
アタイヴォルテール

1

インデックス作成の進行状況を確認する信頼できる方法はありません。innodb-file-per-tableがオンになっている場合、データディレクトリに作成されている一時的な.ibdファイルを調べて現在のファイルのサイズと比較することで、何らかの兆候を得ることができますが、それはそれほどではありません削除/断片化により現在のデータファイルが肥大化する可能性があり、新しいデータファイルには以前のインデックスではなかった追加のインデックスが含まれるため、信頼性が高くなります。

InnoDBプラグインがインストールされていないバージョンのMySQLを使用しているようです。InnoDBプラグインには、インデックスの追加と削除のためにテーブルを完全に再構築する必要のない高速インデックス作成機能があります。InnoDBプラグインはMySQL 5.5でデフォルトで有効になっており、5.1.38以降の構成設定で使用できます。

  • どのバージョンのMySQLを使用していますか?

Percona Serverはかなり以前のバージョン(5.5以前)でInnoDBプラグインをデフォルトで有効にしています。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.