在mysql中实现匹配查询出现的问题(高手进,在线等)

yecool 2003-10-09 12:53:55
参照了http://expert.csdn.net/Expert/FAQ/FAQ_Index.asp?id=40441这篇文章后,我发现有一个问题,当数据表中的数据量较大时,执行速度极慢,
我使用的是文章中最后一个语句:
select table1.* from table1 left join table2 on table1.id=table2.id where table2.id is null;

需找出table1中的id没有和table2中的id匹配上的记录,希望该篇文章作者能给予答复,如何解决这个问题!谢谢!


...全文
75 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yecool 2003-10-13
  • 打赏
  • 举报
回复
回楼上:
1.mrq中的id不是自动增加的,是从mtq的idremote中获取过来的,两者是对应一致的
2.在windows 2k serv环境下
3.我在本地建立一个测试的同型数据库,由于数据量放置较少,大概在几十条左右,执行上述语句很快,但数据量大的时候,就会出现内存溢出的情况

您有好的解决方案吗?非常感想楼上各位对我的解答,不管最终能不能得到一个圆满的答案,我还是非常感激各位能参与我的问题!

yecool
sandyde2 2003-10-12
  • 打赏
  • 举报
回复
1. id not auto increased?
2. in linux or unix?
3. do you have an extra db only for testing? it is better to test ur statement in developing or testing server instead of the production server so that you need not test so many rows.. just some thousand rows are quite enough..

with best wishes

sandy
yecool 2003-10-12
  • 打赏
  • 举报
回复
我用到两个表,两个表的结构如下:
CREATE TABLE mtq (
id bigint(20) NOT NULL default '0',
born bigint(20) NOT NULL default '0',
lastAccess bigint(20) default NULL,
state int(11) default '0',
credit int(11) default '0',
priority int(11) default '0',
receiver varchar(21) NOT NULL default '',
message varchar(160) binary NOT NULL default '',
msgFormat int(11) default '0',
feeType int(11) default '0',
feeValue int(11) default '0',
msgLevel int(11) default NULL,
payer varchar(21) default NULL,
sender varchar(21) default NULL,
svcType varchar(8) default NULL,
reportFlag int(11) default '0',
atTime bigint(20) default NULL,
expireTime bigint(20) default NULL,
idSession int(11) default NULL,
idRemote bigint(20) default NULL,
error_code int(11) default '0',
PRIMARY KEY (id)
) TYPE=MyISAM;

CREATE TABLE mrq (
id bigint(20) NOT NULL default '0',
born bigint(20) NOT NULL default '0',
lastAccess bigint(20) default NULL,
state int(11) default '0',
credit int(11) default '0',
priority int(11) default '0',
smg_id bigint(20) default NULL,
status char(7) NOT NULL default '',
PRIMARY KEY (id)
) TYPE=MyISAM;

两个表中的记录大概会有几十万条左右,而且会越来越多,其中mrq中的id和mtq中的idremote是一一对应的,现在要查找出mrq中的id和mtq中的idremote匹配不上的mrq中的记录
我用的语句是这样的:
select mrq.* from mrq left join mtq on mrq.id=mtq.id where mtq.id is null;
但是执行起来出现内存溢出错误,服务器的内存为1G加上虚拟内存大概在2.5G左右.

后来我实在不行,只能用程序来实现,逐条找出mrq中记录,和mtq中的每一条记录去匹配,这样执行起来虽然不会出现内存溢出,但是执行起来的效率超级慢,大概花了几个小时才做完,真是晕呀~~
有什么好的解决方案吗?我现在都不敢在服务器上乱试了,服务器已经被我搞死了好几次了~55555555
shuixin13 2003-10-09
  • 打赏
  • 举报
回复
是呀,

索引是很重要的,

EXPLAIN SELECT select_options
看看结果呢
fish21cn 2003-10-09
  • 打赏
  • 举报
回复
explain 来看看。
ezhou 2003-10-09
  • 打赏
  • 举报
回复
我怀疑楼主有没有用索引。
lxf_1976 2003-10-09
  • 打赏
  • 举报
回复
请介绍一下表结构以及数据量!

我有3个表,现在各35W条记录,使用类似的语句很快!

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧