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