如何优化Mysql的这个查询?

时间:2015-03-06 21:57:47

标签: mysql performance optimization query-optimization

我使用Mysql,我有一个大约有800,000条记录的表(TablaUnoOriginal),我需要将数据复制到另一个表(TablaUnoCopia)然后删除原始数据,我这样做:

INSERT INTO TablaUnoCopia
SELECT * FROM TablaUnoOriginal
WHERE CampoID in (SELECT DISTINCT (CampoID) FROM Key_Table);

在查询的这一部分" SELECT DISTINCT(CampoID)FROM Key_Table"返回了552条记录。

CampoID是TablaUnoOriginal和Key_Table表中的索引列(主键)。

以下查询返回约150条记录,无论如何都需要7秒钟。

SELECT DISTINCT (CampoID) FROM Key_Table

运行查询时,插入1104行需要446秒。

如何优化此查询?

谢谢。

3 个答案:

答案 0 :(得分:0)

不要使用IN ( SELECT ... );将其更改为JOIN:

SELECT  t.*
    FROM  TablaUnoOriginal AS t
    JOIN  
      ( SELECT  DISTINCT CampoID
            FROM  Key_Table ) AS k   USING(CampoID);

这假设TablaUnoOriginal在CampoID上包含INDEX(或PRIMARY KEY)。

答案 1 :(得分:0)

在简单联接中使用DISTINCT

INSERT INTO TablaUnoCopia
SELECT DISTINCT t.*
FROM TablaUnoOriginal t
JOIN Key_Table k ON t.CampoID = k.CampoID

确保CampoID上有索引。

答案 2 :(得分:0)

如果TablaUnoCopia开始为空,则CampoID是Key_Table表的PK。

执行以下查询:

EXPLAIN INSERT INTO TablaUnoCopia
SELECT * FROM TablaUnoOriginal

在CampoID IN中(SELECT CampoID FROM keysTempTable);

显示以下内容:

Select_type   |     table |     type |  posibble_key |  key |   key_len|    ref |  rows  | extra 
-

SIMPLE  -   keysTempTable   -   ALL -   NULL -  NULL-   NULL-   NULL-   1279  -     Start_temporary

===================================================================

SIMPLE -    TablaUnoOriginal-   eq_ref -    PRIMARY - PRIMARY - 4    -Database_name.keysTempTable.CampoId - 1 - End_temporary