那位帮忙帮我优化一下这个查询语句(100)

  • 主题发起人 主题发起人 huanghq123
  • 开始时间 开始时间
H

huanghq123

Unregistered / Unconfirmed
GUEST, unregistred user!
那位帮忙帮我优化一下这个查询语句,现在查询特别慢,而且每个表的数据量都很大。我用的是mysql数据库。sql.Text := 'SELECT a.ProducNo,a.ProducCN,a.yqcsl,a.rkcount,a.ckcount,a.ymjc FROM yjmxtb a,famxtb b,fatb c where a.wpbs=''3'' and a.yfid='+''''+yfid+''''+' and a.ProducNo=b.MateNo and b.ProducNo=c.ProducNo and c.Sort='+''''+ComboBox3.Text+''''+' group by a.ProducNo';我目前的优化方案:sql.Text :='SELECT a.ProducNo,a.ProducCN,a.yqcsl,a.rkcount,a.ckcount,a.ymjc FROM yjmxtb a,famxtb b where a.wpbs=''3'' and a.yfid='+''''+yfid+''''+' and a.ProducNo=b.MateNo and b.ProducNo in (select ProducNo from fatb where Sort='+''''+ComboBox3.Text+''''+') group by a.ProducNo';
 
把表结构贴出来,并说明主键,光靠这些,别人还得去猜想(a.ProducNo,a.ProducCN,a.yqcsl,a.rkcount,a.ckcount,a.ymjc )在A中是否会重复,没法分析!或者你自己考虑一下使用Exist用法或许比in好一些。
 
你说每个表的数据量都很大1> yjmxtb.ProducNo; famxtb.MateNo; fatb.ProducNo需要建立Index2>你还是没说明(a.ProducNo,a.ProducCN,a.yqcsl,a.rkcount,a.ckcount,a.ymjc )在A中是否会重复3> yjmxtb和famxt是一对多还是1对1? famxt和fatb是一对多还是1对1?4》你原先语句没法通过吧,Select中有6个字段,group部分就1个字段
 
表结构:CREATE TABLE `yjmxtb` ( `id` int(11) NOT NULL auto_increment, `yfid` varchar(6) NOT NULL, `ProducNo` varchar(40) NOT NULL, `ProducCN` varchar(50) NOT NULL, `rkcount` double(15,2) NOT NULL default '0.00', `ckcount` double(15,2) NOT NULL default '0.00', `ymjc` double(15,2) NOT NULL default '0.00', `wpbs` varchar(2) NOT NULL, `Sort` varchar(16) default NULL, `yjrq` date NOT NULL, `yqcsl` double(15,2) NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=latin1(a.ProducNo,a.ProducCN,a.yqcsl,a.rkcount,a.ckcount,a.ymjc )在表中如果yfid相同的情况下是不会重复的中是否会重复。这是一个月结表,YFID表示的是月结IDCREATE TABLE `famxtb` ( `id` int(11) NOT NULL auto_increment, `ProducNo` varchar(40) NOT NULL, `ProducCN` varchar(50) NOT NULL, `MateNo` varchar(40) NOT NULL, `faname` varchar(40) NOT NULL, `wlmc` varchar(50) NOT NULL, `wlsign` varchar(4) NOT NULL, `gyscode` varchar(16) default NULL, `gysjc` varchar(20) default NULL, `RMBPrice` varchar(16) default NULL, `count` varchar(12) NOT NULL, `htxz` varchar(16) default '随整机下', `Specification` varchar(60) default NULL, `kcs` varchar(3) default NULL, `stc` varchar(6) NOT NULL default '是', `hxgc` varchar(24) NOT NULL default '否', PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=latin1CREATE TABLE `fatb` ( `id` int(11) NOT NULL auto_increment, `ProducNo` varchar(40) NOT NULL, `ProducCN` varchar(50) NOT NULL, `faname` varchar(40) NOT NULL, `fazj` varchar(10) NOT NULL, `gyscode` varchar(20) NOT NULL, `gysjc` varchar(30) NOT NULL, `sort` varchar(10) NOT NULL, `gysbj` varchar(12) default NULL, `bhcp` varchar(20) NOT NULL, `fastate` varchar(10) NOT NULL, `fayx` varchar(20) default NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=latin1
 
优化其实就是对表的主键索引,进行改良,语句不代表什么
 
你的所有表主键都是ID,而查询中没有涉及到这项,如果想从主键来提升,估计不太可能。。。我觉得他肯定是1对多,不可能是完全的1对1。LZ说的,我也没好办法,帮你顶下吧
 
1)INDEX从没建过,咂建呢?2)在yfid值相同的情况下不会重复;3)yjmxtb和famxt是一对多,famxt和fatb是1对多4)可以通过。
 
Create Index IndexName On tableName (FieldName)如Create Index Idx_yjmxtbProducNo on yjmxtb(ProducNo)关于4的问题,让别人回答吧。
 
yjmxtb.yfid也加index吧Select a.*From yjmxtb awhere a.wpbs=''3'' and a.yfid='+''''+yfid+''''+' and exist (select b.ProducNo from famxtb b, fatb c where b.a.ProducNo=b.MateNo and b.ProducNo=c.ProducNo and c.Sort='+''''+ComboBox3.Text+'''')
 
后退
顶部