2017-09-22 4 views
0

私は大きなプライベートテーブルのテーブルを持っていますが、私はインデックスがありません。 Mysqlの大きなテーブルでテーブルから他のデータに移動する方法

と私はインデックスを作成したいと思いますが、problemeが、私は追加のインデックス要求を実行すると、テーブルサーバが壊れているということです。

ALTER TABLE `db`.`table` 
ADD INDEX `index_0001` (`col1` ASC); 

だから私は、新しいテーブルと設定に必要なインデックスと動きを作成します。データを新しいテーブルに追加し、名前を変更します。

私は、このマニピュレータを試してみました:

INSERT INTO `db`.`table` (field1,field2,..) select field1,field2,....from eventdata limit 100000 offset 0 ; 
INSERT INTO `db`.`table` (field1,field2,..) select field1,field2,....from eventdata limit 100000 offset 100000 ; 
INSERT INTO `db`.`table` (field1,field2,..) select field1,field2,....from eventdata limit 100000 offset 200000 ; 
.......... etc 

しかし時に、オフセットがより遅くなるより、その後億クエリライン応答になります。

他にも解決策はありますか?

答えて

1

使用limit 100000 offset 100000 ;

tahnksは、MySQLが100000件のレコードを検索し、100001からレコードを取得する手段、

検索100000レコードがテーブルフルスキャンであるため、非常に遅いです。検索する

使用Primary keyPrimary keyは数に分けることができない場合は、レコードを検索するために使用Primary keyJoin

select field1,field2... from tbname tb1,(select pk from tbname limit 100000 offset 100000)tb2 where tb1.pk = tb2.pk

を使用すると、TABLE FULL SCANよりも優れている... where pk >=100000 and pk <= 199999

のように、良い方法です。

+0

ありがとうございました。 しかし、私は3つのフィールドから複合プライマリキーを持っています – ALWAN

+0

@ALWANこのサンプルは唯一のサンプルです、根本原因は、テーブルのフルスキャン、プライマリキーまたは他のunqueキーを使用するより良い方法です:P –

関連する問題