2011-05-09 53 views
0

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

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

表A中包含的原始数据和我的输出表是表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' 

能有人帮我改进这个过程中,或引导我对上述过程的替代品?

感谢

Suketu

+0

这种类型的问题已被问到。 http://stackoverflow.com/questions/2838828/bulk-insert-problem-in-mysql – Ankit 2011-05-09 11:21:46

+0

要使EXPLAIN语法有用,请为这两个表包含“SHOW CREATE TABLES”的输出。 – 2011-05-09 11:41:44

+0

'code' CREATE TABLE'TABLE_A'( 'id' INT(11)无符号NOT NULL AUTO_INCREMENT, 'field1' VARCHAR(255)NOT NULL, 'field2' VARCHAR(255)NOT NULL, 'count_field3' INT (10)无符号NOT NULL, 'field_4' INT(10)无符号NOT NULL, PRIMARY KEY('id') KEY'field2_index'('field2') KEY'field1_index'('field1') )ENGINE = MyISAM AUTO_INCREMENT = 435692 DEFAULT CHARSET = utf8'code' – Suketu 2011-05-10 07:43:09

回答

0

你应该做的整个过程中一个存储过程。

不要截断如此大的表。遵循以下步骤:

  1. 将TableB结构复制到TableB_Copy。
  2. DROP TABLEB。
  3. 重命名TableB_Copy到TABLEB
  4. 禁用索引表B上
  5. 插入从表A中的数据表B到
  6. 创建表B上的索引。
+0

复制,填充它然后用'RENAME TABLE tableB TO tableB_old,tableB_new TO tableB'滚入它会不会更干净? – 2011-05-09 11:40:48

+0

嗨, 它为我工作! – Suketu 2011-05-23 18:56:56

0

据我认为,解决办法是这样的:

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 

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