2016-05-24 6 views
1

私はmysqlを初めて使っています。私は50Kの行(70列)を持つ2つの同一のmysqlテーブルを持っています。これらのテーブルは毎日データフィードによって更新されます。交差/減算などのネストされたクエリを実行する必要があります。mysqlの交差問合せのパフォーマンス

私が使用しようとしているクエリの1つは次のとおりです。 しかし、正しく動作しません。 5分かかりますか? 〜10分。 (端末を介して)応答しない。

SELECT * 
FROM table1 
WHERE table1.sku IN (SELECT t1.sku 
         FROM ((SELECT DISTINCT sku 
           FROM table2) 
           UNION ALL 
           (SELECT DISTINCT sku 
           FROM table1)) AS t1 
         GROUP BY sku 
         HAVING Count(*) >= 2) 

は、どのように私はそれがより速く/正常に動作することができますか?どのようにテーブル/カラム(インデックス、プライマリキーなど)を設定するのですか?あるいは、mysqlサーバ上でチューニングする必要がありますか?

私はいくつかのことを試しました。私はvarchar(75) の列である 'sku'のインデックスを作成しました。私のデータベースサーバーは512MBのメモリを搭載した1つのCoreProcessor(Digital Ocean)サーバー で動作します。

---私が正しく、この特定のクエリを理解していれば、あなたはtable2の中に対応するskuを持ってTABLE1のすべてのレコードを表示しようとしている

+----+--------------------+-----------------------+-------+---------------+---------+---------+------+-------+---------------------------------+ 
| id | select_type  | table     | type | possible_keys | key  | key_len | ref | rows | Extra       | 
+----+--------------------+-----------------------+-------+---------------+---------+---------+------+-------+---------------------------------+ 
| 1 | PRIMARY   | table1    | ALL | NULL   | NULL | NULL | NULL | 30260 | Using where      | 
| 2 | DEPENDENT SUBQUERY | <derived3>   | ALL | NULL   | NULL | NULL | NULL | 65677 | Using temporary; Using filesort | 
| 3 | DERIVED   | table2    | range | NULL   | sku_idx | 227  | NULL | 31016 | Using index for group-by  | 
| 4 | UNION    | table1    | range | NULL   | sku  | 227  | NULL | 30261 | Using index for group-by  | 
| NULL | UNION RESULT  | <union3,4>   | ALL | NULL   | NULL | NULL | NULL | NULL |         | 
+----+--------------------+-----------------------+-------+---------------+---------+---------+------+-------+---------------------------------+ 

答えて

0

「EXPLAIN」との問い合わせ。はるかに簡単なクエリによって達成することができ

SELECT * 
FROM table1 
WHERE table1.sku IN (SELECT DISTINCT table2.sku FROM table2) 
GROUP BY table1.sku 

か、との合流:

SELECT table1.* 
FROM table1 
INNER JOIN table2 ON table1.sku = table2.sku 
GROUP BY table1.sku 

あなたはtable1.skutable2.sku

+0

のインデックスを持っている場合、これは瞬時に動作するはずです多くのありがとう@Tudor –

関連する問題