2016-03-22 16 views
0

私は2つのデータベーステーブルを持っています。& product_x_categoryとproductsテーブルは150,000行、product_x_categoryはおそらく145,000行です。Mysql - データベースの多くのデータ

データベースの非常に多くのデータを処理する最も良い方法は何ですか?

たとえば、どのカテゴリにも含まれていないデータベースのproructsから抜け出そうとします。

SELECT * FROM products where id NOT IN(SELECT product_id FROM product_x_category); 

とX他の方法私が知っている... - グループの連結などに参加しますが、すべてのクエリが長いにしている(20秒+ - またはちょうどデシベルタイムアウト)

誰がどのように私に助言することができますそれ?ありがとう!

+2

150000行は実際にはあまり実際にはありません。 – PMF

+0

問合せ(説明)、索引などを確認してください。150K行はあまり意味がありません – JimL

+0

これは十分な情報ではありませんが、私の最初の本能は 'explain [ここにあなたの質問を記入] 'を使用して、 ](http://dev.mysql.com/doc/refman/5.6/en/mysql-indexes.html)は、クエリの速度に役立ちます。これまで述べてきたように、現代のコンピューティングパワーに関する限り、これはあまりデータではありません。 – kungphu

答えて

3

NOT EXISTSは、NOT INよりも優れたパフォーマンスを示すことがあります。また、サブクエリの値がNULLの場合、より効果的です。だから、書き込みに慣れる:

SELECT p.* 
FROM products p 
WHERE NOT EXISTS (SELECT 1 FROM product_x_category pxc WHERE pxc.id = p.product_id); 

第二に、あなたはこのクエリのproduct_x_category(product_id)のインデックスをしたいです。

最後に、製品がproduct_x_categoryテーブルに正しいので、外部キー制約を追加します。

alter table product_x_category add constraint fk_pxc_product_id foreign key (product_id) references products(id); 

をそのように、あなたがテーブルに正しい製品のみを入力することができます(そして、あなたはのために似た何かをしたいでしょうカテゴリー)。

注:データに一貫性がない場合は、すでにデータがあるテーブルにこれを追加すると問題が発生する可能性があります。

+0

ありがとう、それは素晴らしいです。問題は外部キーにありました。 –

1
select a.* from products a left join product_x_category b 
on a.id = b.product_id where b.product_id is NULL 

これはproduct_x_categoryに存在しないレコードを提供します

+0

ここで 'a。*'を選択するだけで、b.product_id IS NULLをwhere句に入れても、クエリの 'ON '部分ではうまく動作しない可能性があります。 – apokryfos

+0

あなたは正しい、 回答を編集しました。 – Priyanshu

+0

ありがとう、鉱山または@Gordon Linoffのクエリは約0.8秒続いて、このクエリは約0.08(y)、nice –

関連する問題