2017-05-26 11 views
0

私は、最大のテーブルが~3 mlnレコードを数えているMySqlデータベースを正規化して "クリーニング"しています。大きなテーブルで正規化クエリを起動するためにローカルMySqlを高速化します

いくつかのフィールドの名前を変更(非常に高速)し、その順序を(かなり速く)変更し、トリム、文字列のサニタイズ、一部の他のテーブルへの抽出、外部キーIDの保持...

私のローカルマシンでクエリを高速化できる方法はありますか?

私はMariaDB 10.1.21(XAMPP製)を搭載し、MacBook Air 8GB RAMで動作しています。

私は既にインデックスを多くのフィールドに配置していますが、カメとしてはまだ遅いです。

ご了承ください。ありがとう!

編集:リクエストしたとおり、私が行っているより多くの情報と最適化。

私は基本的に、3つのテーブルに分散された正規化されていない列を含む大きなテーブルを持っています。私が持っているもの

:私は

companies (id, name, street, id_city, id_subcategory, ...) 
cities(id, name, ...) 
categories(id, name) 
subcategories(id, name, id_category) 

は、だから私はきれいにし、次のように件のデータをexctract欲しいもの

companies (id, name, street, city_name, category_name, subcategory_name) 

トリムと「汚い」分野からクリーンキャリッジリターン:適切なカテゴリを持っていない

update companies set mic_cat = TRIM(REPLACE(REPLACE(mic_cat, '\r', ''), '\n', '')); 

削除企業。

delete from companies where mic_cat is null or mic_cat = '' or mac_cat is null or mac_cat = ''; 

新しいテーブルのフィールドと場所からデータを抽出します。

insert into categories (name) select distinct mac_cat from companies; 
insert into subcategories (name, id_category) select distinct mic_cat,categories.id from companies JOIN categories ON mac_cat = categories.name; 

はid_referenceを追加します。

ALTER TABLE companies ADD COLUMN id_subcategory int; 

は、キーを取得...

UPDATE companies left join subcategories on companies.mic_cat = subcategories.name set id_subcategory = subcategories.id; 

最後の1つは非常に遅かったので、私はl索引を作成して、companies.mic_catとsubcategories.nameに2つの索引を作成してください。これはかなり固定されています。

+1

意味のある回答については、サンプル表のスキーマと、「トリム、文字列のサニタイズ、抽出」クエリの1つを表示する必要があります。 –

+1

いくつかのテーブルで列を再編成するために、いくつかのALTER TABLE操作を実行しているようです。索引を追加するだけでは、表の再構成に役立つだけでなく、表の再構成のために*もっと*機能します。 –

答えて

0
  • UPDATE文ですべての更新を行います。
  • インデックスにある列を変更する必要がある場合は、DROPこれらのインデックスが最初に、ADDが後で表示されます。 (助けます)
  • ALTERsすべてをALTERというステートメントで実行してください。 (これは常に最善のアドバイスではありません)
  • 行をまとめると思います。

いくつかの問題に対処するために、上記の試行する:

  • UPDATEWHERE句(時にはWHERE有する)ことなく、むしろ高価であり、テーブル全体をスキャンします。
  • インデックスされた列が変更されると、インデックスの1つの場所からインデックスの行を削除し、別の場所に追加する必要があります。 にはINSERTを加えたものと考えるとかなり高価です。
  • ALTER "その場で"作業を行うこともできないこともあります。そのように複数の変更を行うことができない場合は、すべての変更を同時に行うために単一のコピー(つまり、単一のALTER)を実行することが最善です。これは、新しい空のテーブルを効果的に作成し、それを変更し、すべてのデータをそのテーブルにコピーし、すべてのインデックスを再作成し、名前を変更して元の場所に戻します。

インデックスの詳細を...

  • ないでインデックスフラグ。そのような索引は排除されます。
  • WHERE句を調べて、どのインデックスが役立つかを確認してください。 INDEX(a,b)一部クエリのINDEX(a), INDEX(b)よりもはるかに良いことがあります
  • は「複合」のインデックスについて学びます。
  • 盲目的に各列のインデックスを作成しないでください。大きな廃棄物です。

3M行が多分多くあります。多くの場合、UPDATE(またはDELETE)の「チャンク」よりも優れています。 my blogを参照してください。

関連する問題