Mysql交集查询性能

时间:2016-05-24 06:13:59

标签: mysql performance intersection query-tuning

我对mysql很新。我有2个相同的mysql表,每个表有50K行(70列)。这些表每天都通过数据馈送进行更新。我需要执行一些嵌套查询,比如十字路口/减法等。

我尝试使用的其中一个查询如下。 但它没有正常工作。要么需要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服务器上进行任何调整?

我尝试了几件事。我在' sku'上创建了索引。哪个是varchar(75) 列。我的数据库服务器在1个CoreProcessor(数字海洋)服务器上运行 512MB内存。

---查询' EXPLAIN'

+----+--------------------+-----------------------+-------+---------------+---------+---------+------+-------+---------------------------------+
| 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 |                                 |
+----+--------------------+-----------------------+-------+---------------+---------+---------+------+-------+---------------------------------+

1 个答案:

答案 0 :(得分:0)

如果我正确理解了这个特定的查询,你试图显示table1中表2中具有相应sku的所有记录。

这可以通过一个更简单的查询来实现:

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

上有索引,这应该会立即生效