【发布时间】: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的输出。 -
codeCREATE TABLETABLE_A(idint(11) unsigned NOT NULL AUTO_INCREMENT,field1varchar(255) NOT NULL,field2varchar(255) NOT NULL, @ 987654330@ int(10) unsigned NOT NULL,field_4int(10) unsigned NOT NULL, 主键 (id), 键field2_index(field2), 键field1_index(field1)) 引擎=MyISAM AUTO_INCREMENT=435692 默认字符集=utf8code
标签: mysql inner-join large-data