MariaDB社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2614|回复: 3
打印 上一主题 下一主题

in语句优化~~求助~

[复制链接]
跳转到指定楼层
1#
发表于 2012-2-6 22:33:31 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
以下是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 做查询发现没什么提高,无奈求助各位高手

本帖被以下淘专辑推荐:

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖1 顶1 踩
4#
发表于 2012-4-20 11:42:45 | 只看该作者
恩,就是第一个in导致的查询缓慢问题了,第二个用到了primary。看看如果少的话并且 catid 唯一可不可以在程序里面用or进行查询链接,先”select `arrchildid` from `category` where catid=程序传进来的catid”得道结果存到数组里面,然后用程序处理下变成catid=''or...的形式。
3#
发表于 2012-3-5 17:55:48 | 只看该作者
in(subquery)在mysql中是非常慢的,还是不要用的好。换成join如果还是慢,explain看索引情况。
2#
 楼主| 发表于 2012-2-7 21:55:18 | 只看该作者
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|手机版|MariaDB社区 ( 京ICP备07012489号    |
业务联系: QQ:48474881; 邮箱: 48474881@qq.com; 电话:13911732319
声明:本站部分文章是网友转载,若未经作者同意或署名有误,请联系网站管理员。

GMT+8, 2024-11-25 10:04 , Processed in 0.067242 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表