【问题标题】:Comparison time for 2 large MySQL database table2个大型MySQL数据库表的比较时间
【发布时间】:2012-08-30 10:49:53
【问题描述】:

我已将 2 个 .csv 文件导入到 MySQL 表中进行比较。现在我想使用 join 比较它们。

但是,每当我在查询中包含这两个表时,我都没有收到 phpMyAdmin 的响应(有时它显示“超出最大执行时间)。

两个 db 表中的记录大小最大为 73k。我不认为那是巨大的数据。即使是像

这样的简单查询
SELECT *
FROM abc456, xyz456

似乎挂了。我做了一个解释,我在下面得到了这个。我不知道从中得到什么。

id  select_type     table   type    possible_keys   key     key_len     ref    rows     Extra
1   SIMPLE  abc456  ALL     NULL    NULL    NULL    NULL    73017   
1   SIMPLE  xyz456  ALL     NULL    NULL    NULL    NULL    73403   Using join buffer

有人可以帮忙吗?

更新:添加了带有复合键的表结构。该表中将插入大约 100000 多条记录。

CREATE TABLE IF NOT EXISTS `abc456` (
`Col1` varchar(4) DEFAULT NULL,
`Col2` varchar(12) DEFAULT NULL,
`Col3` varchar(9) DEFAULT NULL,
`Col4` varchar(3) DEFAULT NULL,
`Col5` varchar(3) DEFAULT NULL,
`Col6` varchar(40) DEFAULT NULL,
`Col7` varchar(200) DEFAULT NULL,
`Col8` varchar(40) DEFAULT NULL,
`Col9` varchar(40) DEFAULT NULL,
`Col10` varchar(40) DEFAULT NULL,
`Col11` varchar(40) DEFAULT NULL,
`Col12` varchar(40) DEFAULT NULL,
`Col13` varchar(40) DEFAULT NULL,
`Col14` varchar(20) DEFAULT NULL,
KEY `Col1` (`Col1`,`Col2`,`Col3`,`Col4`,`Col5`,`Col6`,`Col7`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

【问题讨论】:

  • 您是在本地 MySQL 服务器上工作还是在某个网络主机上工作?

标签: php mysql


【解决方案1】:

看起来您在查询中执行纯 catesian 联接。

您不应该加入某些字段的表格吗?如果你这样做了,查询仍然需要很长时间才能执行,你应该放置适当的索引来加快查询速度。

花费这么长时间的原因是它试图将第一个表的每一行连接到第二个表的每一行。

【讨论】:

  • 实际上我确实加入了某些字段,甚至在总共 14 列中的 7 列上放置了索引......但没有任何改进:(
  • @SunnyD'Souza 您能否在您的问题中包含完整的查询和索引,以便我查看一下?并举例说明每张表有多少条记录。
  • 抱歉,我的回答太迟了,而且反应迟缓……但是已经用表格结构的查询更新了我的问题
【解决方案2】:

您需要一个连接条件,以某种方式确定应该匹配哪些行:

SELECT * FROM abc456, xyz456 WHERE abc456.id = xyz456.id

【讨论】:

  • ... 否则您将获得笛卡尔连接,这意味着“所有组合:表 1 中的每一行与表 2 中的每一行”。如果两个表都有 73k 行,您将得到 5329000000 行结果。
【解决方案3】:
  1. 在连接列上添加索引。这应该有助于提高性能。

  2. 使用 MySQL Workbench 或 MySQL Client(控制台)进行长查询。 phpmyadmin 并非旨在显示返回 100k 行的查询:)

  3. 如果你真的必须使用 phpmyadmin 并且需要运行长查询,你可以使用 Firefox 扩展来防止 phpmyadmin 超时:phpMyAdmin Timeout Preventer (direct link!)

有一个直接链接,因为找不到英文描述。

【讨论】:

  • 感谢您的回复伙伴,我正在尝试将 csv 文件的内容导入 2 个 db,然后将它们进行比较。现在有些文件包含 30 列或更多列的 50k+ 条记录。我发现您不能在超过 16 列上创建索引。我需要在所有 30 列上执行连接以找出两者之间的区别,因为没有主键这样的:(如果你有的话,建议一个更简单的解决方案。
猜你喜欢
  • 1970-01-01
  • 2013-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多