2017-08-20 4 views
0

データベースにあるテーブルを変更して、特定のアイテムより多くの情報を保存できるようにするには、supplier。次のように私は1つのテーブルを持っている:このMySQLの声明を速めるインデックス

製品(〜285000行)

  • supplier_name
  • バーコード
  • ...

PRODUCT_IDそして、作成したいですさらに2つのテーブル:

サプライヤー

  • SUPPLIER_ID(UUID
  • 名(製品テーブルから
  • 接触
  • ...

サプライヤー製品

  • PRODUCT_ID(製品FK
  • SUPPLIER_ID(サプライヤーFK
  • 配信オプション
  • ...

supplierテーブルニーズを区別エントリを充填することproductテーブルのsupplier_namesupplier_productテーブルにはsupplierテーブルのUUIDが必要です。これまで

私のSQLは次のとおりです。

INSERT INTO supplier (name, id) 
SELECT DISTINCT(TRIM(supplier)), UUID() FROM product 
WHERE supplier_name IS NOT NULL AND TRIM(supplier_name) != "" 
AND TRIM(supplier_name) NOT IN (
    SELECT name FROM supplier 
); 

は〜4000行を作成します。次に、

INSERT INTO supplier_product (id, supplier_id, product_id, barcode, ...) 
SELECT UUID(), s.id, p.product_id, p.barcode, ... 
    FROM product p 
    INNER JOIN supplier s ON TRIM(p.supplier_name) = s.name 
    WHERE s.name IS NOT NULL; 

クエリは現在30秒後にタイムアウトしています。これらの2つのテーブルを移入するより良い方法はありますか?

このように多くのテーブルを作成することは、私が頻繁に実行したパターンなので、より最適な方法があればいくつかのアドバイスをいただければ幸いです。

+1

TRIMを取り除く。これにより、索引を使用できなくなります。データをトリミングする必要がある場合は、データベースでトリミングします。 – EJP

答えて

0

nameテーブルのインデックスをsupplierテーブルに追加しました。タイムアウトが表示されなくなりました。 が実行された後、このインデックスを削除できます。