2011-01-04 4 views
13

私は約430万行のテーブルunused(MySQLで)を持っています。テーブルは次のようになります。大きなテーブルにインデックスを追加するのにはいつもかかります

CREATE TABLE `unused` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `account_id` bigint(20) DEFAULT NULL, 
    `heading_label` varchar(255) NOT NULL, 
    `value` varchar(255) NOT NULL, 
    `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
    PRIMARY KEY (`id`), 
    KEY `fk_account_id` (`account_id`), 
    CONSTRAINT `unused_ibfk_1` FOREIGN KEY (`account_id`) REFERENCES `account` (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=80524905 DEFAULT CHARSET=latin1 

インデックスを追加すると、このテーブルのクエリが高速になる可能性があります。私はこれを実行しようとしました:

私はこのコマンドをMySQLを再起動する前に多分1,2時間実行させました。この表には500万行以上の行がありますが、この種のものを実行するには1時間以上かかるようには見えません。しかし、おそらくそれは正常です。私は自分が何をしているのか本当にわからない。誰かが私を啓発することはできますか?

+1

...です。 –

+0

これを含めるように質問を編集しました。 –

答えて

15

サーバーの仕様によっては正常です。 MySQLがインデックスを作成する方法は、テーブルによって行われ、インデックスをソートして追加することです。つまり、すべてのデータを書き直してから、すべてのデータをソートする必要があります(安価ではありません)。これは、サーバーのI/Oパフォーマンスと、それを与えることができるRAMの量によって異なります。ここで

は、より多くの情報のためのいくつかのリソースを使用すると、実際のテーブル定義を与えた場合、それが役立つだろう

+1

合意。 1.2milの行テーブルにインデックスを追加したところ、30分かかりました。 – Mikhail

+1

しかし、それはハードウェアによって異なります。生産庫(2xquadコアxeon、32gbラム、FC SAN)では、intカラムに5億のローテーブル(30gbテーブルサイズ)のインデックスを追加するのに約20分かかります。すべての詳細を知らなくても、何が速いか遅いのかを言うことは不可能なので、データタイプ、サイズ、I/Oスピード、メモリサイズなどにはそれほど多くのものがあります。 – ircmaxell

+0

私は2.4GHzプロセッサと4GBを持っていますRAMの場合は、それが役立ちます。 –

関連する問題