【问题标题】:MySQL writing a query with 2 million records to a new tableMySQL 将包含 200 万条记录的查询写入新表
【发布时间】:2014-05-08 00:35:16
【问题描述】:

我有 5 个表,每个表有 1.8 到 200 万条记录,每个表都有重叠的列。

我正在尝试用我需要的列和记录填充一个新表,但我估计我的查询需要 1.7 天才能完成。

我已将 apache、mysql 和 php 内存使用扩展到 GB 范围内,并将所有超时设置为 10 天区域内。

那么,我的问题是填充这个新表的最佳方式是什么? 完成后,我可以为新表删除表 1、2、3、4 和 5。

这是我的查询:

insert into new_table 
(col1,col2,col3,col4,col5,col6,col7,col8,col9)
select 
t1.col1,t.2col2,t.3col3,.t4col4,t5.col5,t1.col6,t1.col7,t2.col8,t3.col9
from
table1 as t1,
table2 as t2,
table3 as t3,
table4 as t4,
table5 as t5
where
t1.col1 = t2.col1
and
t1.col1 = t3.col1,
and
t1.col1 = t4.col1,
and
t1.col1 = t5.col1

【问题讨论】:

  • 每个表的col1 上是否有索引,还是主键?
  • 表(col1)上是否有索引?
  • 数据一团糟,所以它在任何表上都没有主键或索引。
  • 1.使您的联接显式,而不是隐式。 2. 如果您在用于连接的列上没有索引,请在这些列上放置索引。 3. 这听起来根本不需要 PHP 或 Apache,最好不要。
  • 我正在使用 MySQL Workbench,php 将使用创建的新表。

标签: php mysql sql apache


【解决方案1】:

幸运的是,这很简单。您可以将SELECT 查询添加到CREATE TABLE

CREATE TABLE newtable SELECT t1.c1,t2.c2,t3.c3,t4.c4,t5.c5 FROM t1
INNER JOIN t2 ON t1.c1 = t2.c1
INNER JOIN t3 ON t1.c1 = t3.c1
INNER JOIN t4 ON t1.c1 = t4.c1
INNER JOIN t5 ON t1.c1 = t5.c1

等等,但是您当前正在创建当前的SELECT 语句。我使用了显式连接,因为我认为它们更容易理解,但是您的查询也可以。您可能还想添加PRIMARY KEY,但您可以随时修改表格以执行此操作。

ALTER TABLE newtable ADD PRIMARY KEY(c1);

就是这样!你已经完成了。

【讨论】:

  • 检查后... 表 2 到 5 有主键,但表 1 没有。没有创建其他索引。目标表有一个主键和 2 个索引设置。我现在快 24 小时了,查询仍在运行!继续!应该在周六(周三晚上 11 点开始)之前完成,哈哈!手指交叉!如果它不起作用,我将在 table1 上粘贴一个主键并更改我的查询以使用连接,看看它在 10,000 条记录上的速度有多快,以预测需要多长时间。如果它再次出现在 day 区域中,我会通过 php 进行某种批处理,一次只能处理 10,000 条记录。
猜你喜欢
  • 2022-10-02
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多