如何优化 Mysql 的查询?

How can I optimize this query of Mysql?

我用Mysql,我有一个table有大约800,000条记录(TablaUnoOriginal),我需要将数据复制到另一个table(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 tables 中的索引列(主键)。

以下查询 returns 大约 150 条记录,执行它需要 7 秒。

SELECT DISTINCT (CampoID) FROM Key_Table

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

如何优化此查询?

谢谢。

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

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

这假设 TablaUnoOriginal 在 CampoID 上包含一个索引(或主键)。

在简单连接上使用 DISTINCT

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

确保 CampoID 上有索引。

如果 TablaUnoCopia 开始是空的,CampoID 是 Key_Table table 的 PK。

执行以下查询:

EXPLAIN INSERT INTO TablaUnoCopia
SELECT * FROM TablaUnoOriginal

CampoID 在哪里(SELECT CampoID 来自 keyTempTable);

显示以下内容:

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