如何优化 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
我用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