MariaDB社区

标题: in语句优化~~求助~ [打印本页]

作者: xiaoniu028    时间: 2012-2-6 22:33
标题: in语句优化~~求助~
以下是phpcms 产品和分类的数据库设计,表categeory 结构:
CREATE TABLE `category` (
  `catid` smallint(5) unsigned NOT NULL auto_increment,
  `siteid` smallint(5) unsigned NOT NULL default '0',
  `module` varchar(15) NOT NULL,
  `type` tinyint(1) unsigned NOT NULL default '0',
  `modelid` smallint(5) unsigned NOT NULL default '0',
  `parentid` smallint(5) unsigned NOT NULL default '0',
  `arrparentid` varchar(255) NOT NULL,
  `child` tinyint(1) unsigned NOT NULL default '0',
  `arrchildid` mediumtext NOT NULL,
  `catname` varchar(30) NOT NULL,
  `style` varchar(5) NOT NULL,
  `image` varchar(100) NOT NULL,
  `description` mediumtext NOT NULL,
  `parentdir` varchar(100) NOT NULL,
  `catdir` varchar(30) NOT NULL,
  `url` varchar(100) NOT NULL,
  `items` mediumint(8) unsigned NOT NULL default '0',
  `hits` int(10) unsigned NOT NULL default '0',
  `setting` mediumtext NOT NULL,
  `listorder` smallint(5) unsigned NOT NULL default '0',
  `ismenu` tinyint(1) unsigned NOT NULL default '1',
  `sethtml` tinyint(1) unsigned NOT NULL default '0',
  `letter` varchar(30) NOT NULL,
  `usable_type` varchar(255) NOT NULL,
  `additional` text NOT NULL,
  `commenttypeid` smallint(5) unsigned NOT NULL default '0',
  PRIMARY KEY  (`catid`),
  KEY `module` (`module`,`parentid`,`listorder`,`catid`),
  KEY `siteid` (`siteid`,`type`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=12101 ;

表中就catid 这个是大类的ID ,arrchildid这个是catid的子类所以arrchildid的值一般都是(1234,124,4578,..等),以下是产品表数据库设计:
CREATE TABLE `product` (
  `id` mediumint(8) unsigned NOT NULL auto_increment,
  `catid` int(10) unsigned NOT NULL default '0',
  `typeid` smallint(5) unsigned NOT NULL,
  `title` varchar(80) NOT NULL default '',
  `style` char(24) NOT NULL default '',
  `thumb` varchar(100) NOT NULL default '',
  `keywords` varchar(40) NOT NULL default '',
  `description` char(255) NOT NULL default '',
  `posids` tinyint(1) unsigned NOT NULL default '0',
  `url` char(100) NOT NULL,
  `listorder` tinyint(3) unsigned NOT NULL default '30',
  `status` tinyint(2) unsigned NOT NULL default '1',
  `sysadd` tinyint(1) unsigned NOT NULL default '0',
  `userid` mediumint(8) unsigned NOT NULL default '0',
  `username` varchar(20) NOT NULL default '',
  `inputtime` int(10) unsigned NOT NULL default '0',
  `updatetime` int(10) unsigned NOT NULL default '0',
  `areaid` int(10) unsigned NOT NULL default '0',
  `price` float unsigned NOT NULL default '0',
  `elite` varchar(255) NOT NULL default '0',
  `material` varchar(255) NOT NULL default '',
  `standards` varchar(255) NOT NULL default '',
  `yongtu` varchar(255) NOT NULL default '',
  `hits` int(5) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `catid` (`catid`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=971 ;
该表中catid 存的是分类的ID

该系统有筛选择功能 每一次程序先获得category 表中 catid值 再 获得该分类的arrchildid集合:所以筛选择商品分类sql语句如下:
select * from `product` where catid in (select `arrchildid` from `category` where catid=程序传进来的catid);
现在发现这样的语句超慢,求一个解决的方法 我试过用临时表存arrchildid集合然后用 inner join 做查询发现没什么提高,无奈求助各位高手
作者: xiaoniu028    时间: 2012-2-7 21:55

作者: croso    时间: 2012-3-5 17:55
in(subquery)在mysql中是非常慢的,还是不要用的好。换成join如果还是慢,explain看索引情况。
作者: coky    时间: 2012-4-20 11:42
恩,就是第一个in导致的查询缓慢问题了,第二个用到了primary。看看如果少的话并且 catid 唯一可不可以在程序里面用or进行查询链接,先”select `arrchildid` from `category` where catid=程序传进来的catid”得道结果存到数组里面,然后用程序处理下变成catid=''or...的形式。




欢迎光临 MariaDB社区 (http://123.56.88.72/) Powered by Discuz! X3.2