【问题标题】:Large records table insertion issue Mysql大记录表插入问题 Mysql
【发布时间】:2011-08-21 14:59:53
【问题描述】:

我是一名开发人员,在管理包含大量记录的表时遇到问题。

我正在执行一个 cron 作业来填充主表(表 A)中的数据,该表有 5-6 列和大约 4,00,000 到 5,00,000 行,然后创建另一个表,该表中的数据将继续增加随着时间的推移。

TABLE A 包含原始数据,我的输出表是 TABLE B

我的 cron 脚本截断表 B 中的数据,然后使用选择查询插入数据

TRUNCATE TABLE_B; 

INSERT INTO TABLE_B (field1, field2) 
SELECT DISTINCT(t1.field2), t2.field2 
FROM TABLE_A AS t1 
INNER JOIN TABLE_A t2 ON t2.field1=t1.field1 
WHERE t1.field2 <> t2.field2 
GROUP BY t1.field2, t2.field2 
ORDER BY COUNT(t1.field2) DESC; 

上面的选择查询产生大约 1,50,000 到 2,00,000 行

现在填充表 B 需要花费太多时间,同时如果我的应用程序尝试访问表 B 则选择查询失败

解释查询结果如下:

'1','PRIMARY','T1','ALL','field1_index',NULL,NULL,NULL,'431743','Using temporary;Using filesort' 
'1','PRIMARY','T2','ref','field1_index','field1_index','767','DBNAME.T1.field1','1','Using where' 

有人可以帮助我改进这个过程,或者指导我上述过程的替代方案吗?

谢谢

苏克图

【问题讨论】:

  • 有人问过这类问题。 stackoverflow.com/questions/2838828/…
  • 要使 EXPLAIN 语法有用,请在两个表中包含 SHOW CREATE TABLES 的输出。
  • code CREATE TABLE TABLE_A (id int(11) unsigned NOT NULL AUTO_INCREMENT, field1 varchar(255) NOT NULL, field2 varchar(255) NOT NULL, @ 987654330@ int(10) unsigned NOT NULL, field_4 int(10) unsigned NOT NULL, 主键 (id), 键 field2_index (field2), 键 field1_index (field1)) 引擎=MyISAM AUTO_INCREMENT=435692 默认字符集=utf8 code

标签: mysql inner-join large-data


【解决方案1】:

根据我的观点,解决方案是这样的:

SELECT 
    DISTINCT(t1.field2), t2.field2 
    FROM 
        TABLE_A AS t1
    INNER JOIN 
        TABLE_A t2 ON 
        t2.field1=t1.field1 
    WHERE
        t1.field2 <> t2.field2 
    GROUP BY
        t1.field2, t2.field2 
    ORDER BY
       COUNT(t1.field2)
    DESC INTO OUTPUT "PATH-TO-FILE";

例如文件为“C:\TEMP\DATA1.SQL”。这个查询会发生什么,一个简单的新文件是用 TAB 分隔符创建的,以插入到任何表中。 现在如何将数据导入表格。

LOAD DATA
    "PATH-TO-FILE"
INTO TABLE
     table_name

通过此查询,数据将被插入,另一方面,您将能够使用要插入数据的表。

【讨论】:

    【解决方案2】:

    您应该在存储过程中完成整个过程。

    不要截断这么大的表。请按照以下步骤操作:

    1. 将 TableB 结构复制到 TableB_Copy。
    2. 删除表 B。
    3. 将 TableB_Copy 重命名为 TableB
    4. 禁用 TableB 上的索引
    5. 将表A中的数据插入表B中
    6. 在 TableB 上创建索引。

    【讨论】:

    • 制作一个副本,填充它然后用RENAME TABLE tableB TO tableB_old, tableB_new TO tableB滚动它不是更干净吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    相关资源
    最近更新 更多