【问题标题】:How can I optimize this query of Mysql?我怎样才能优化这个Mysql的查询?
【发布时间】:2015-03-06 21:57:47
【问题描述】:

我用的是Mysql,我有一个大约有80万条记录的表(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 秒。

如何优化这个查询?

谢谢。

【问题讨论】:

  • 您可以考虑将子查询推送到临时表中,以防止其被多次执行。
  • @jtimperley:你怎么知道它被执行了多次而没有看到EXPLAIN的结果?
  • TablaUnoCopia 一开始是空的吗? EXPLAIN 告诉您有关此查询的什么信息? CampoID 是单独作为 Key_Table 的 PK,还是作为复合 PK 的一部分?如果是这样,它是那个键的 first 部分吗?

标签: mysql performance optimization query-optimization


【解决方案1】:

在简单的连接上使用DISTINCT

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

确保CampoID 上有索引。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 表 TablaUnoOriginal 包含一个主键是“CampoID”。
    【解决方案3】:

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

    执行以下查询:

    EXPLAIN INSERT INTO TablaUnoCopia
    SELECT * FROM TablaUnoOriginal
    

        CampoID 在哪里(从 keysTempTable 中选择 CampoID);

    显示以下内容:

    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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      • 2021-04-30
      • 1970-01-01
      • 2021-08-01
      • 1970-01-01
      • 2012-02-02
      • 2022-01-11
      相关资源
      最近更新 更多