在大型数据集上使用JOIN运行SQL查询

时间:2014-11-24 19:25:57

标签: mysql database join

我是使用MySQL的新手。

我试图在80,000(这是表B)的数据库与40GB数据集(大约6亿条记录)之间运行内部联接查询(这是表A)

Mysql是否适合运行此类查询? 我应该期待它花多少时间?

这是我在下面的代码。但是,由于我的dbs连接在60000秒失败,它失败了。

set net_read_timeout = 36000;


INSERT
INTO    C
SELECT A.id, A.link_id, link_ref, network, 
date_1, time_per, 
veh_cls, data_source, N, av_jt 
from A
inner join B
on A.link_id = B.link_id; 

我开始研究如何将40GB的表大小减少到临时表,以尝试使查询更易于管理。但我一直在

错误代码:1206。锁定总数超过锁定表大小646.953秒

我是否在正确的轨道上? 干杯!

我拆分数据库的代码是:

LOCK TABLES TFM_830_car WRITE, tfm READ;
INSERT
INTO    D
SELECT A.id, A.link_id, A.time_per,  A.av_jt 
from A
where A.time_per = 34 and A.veh_cls = 1;
UNLOCK TABLES;

也许我的表索引是正确的,我只有一个简单的主键

CREATE Table A
(
id int unsigned Not Null auto_increment,
link_id varchar(255) not Null,
link_ref int not Null,
network int not Null,
date_1 varchar(255) not Null,
#date_2 time default Null,
time_per int not null,
veh_cls int not null,
data_source int not null,
N int not null,
av_jt int not null,
sum_squ_jt int not null,


Primary Key (id)
);


Drop table if exists B;
CREATE Table B
(
id int unsigned Not Null auto_increment,
TOID varchar(255) not Null,
link_id varchar(255) not Null,
ABnode varchar(255) not Null,

#date_2 time not Null,

Primary Key (id)

);

就架构而言,只是在数据库下加载了这两个表(A和B)

2 个答案:

答案 0 :(得分:0)

我相信这篇文章已经给出了答案:The total number of locks exceeds the lock table size

即。使用表锁来避免InnoDB默认的逐行锁定模式

答案 1 :(得分:0)

感谢您的帮助。

索引似乎解决了这个问题。通过索引:

,我设法将查询时间从700secs减少到每个记录约0.2secs

A.link_id

即。来自

from A
inner join B
on A.link_id = B.link_id;

发现这真的很有用。对我这样的新人有帮助

http://hackmysql.com/case4

用于索引的代码是:

CREATE INDEX linkid_index ON A(link_id);