MySQL 主表对应多表查询优化

flyingfree5 2010-03-24 03:43:51
有两张表,主表 zb_product 数据2万,属性从表 zb_product_attr 20万,根据zb_product_attr 表的属性查询 zb_product 不重复的数据,下面是我写的SQL,查询速度比较慢,请问有什么优化的解决方法?

SELECT a.* FROM zb_product a
LEFT JOIN zb_product_attr b ON a.id=b.product_id
GROUP BY a.id
ORDER BY a.id DESC

表zb_product
CREATE TABLE `zb_product` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`sn` varchar(100) NOT NULL,
`name` varchar(200) NOT NULL,
`category_id` int(10) unsigned NOT NULL,
`stock` decimal(16,2) NOT NULL DEFAULT '0.00',
`stock_unit` varchar(10) NOT NULL,
`warn_stock` float NOT NULL DEFAULT '0',
`base_price` decimal(16,2) NOT NULL DEFAULT '0.00',
`sale_price` decimal(16,2) NOT NULL DEFAULT '0.00',
`market_price` decimal(16,2) NOT NULL,
`attr_type_id` int(10) unsigned NOT NULL DEFAULT '0',
`update_time` int(10) unsigned DEFAULT NULL,
`status` smallint(5) unsigned DEFAULT '1',
`description` text,
`remark` text,
`create_time` int(10) unsigned DEFAULT NULL,
`create_account` varchar(64) NOT NULL,
`package` text,
`accessories` text,
`similar` text,
`is_birthstone` tinyint(4) DEFAULT '0',
`birthstone_type` varchar(20) DEFAULT NULL,
`is_hot` tinyint(4) DEFAULT '0',
`discount` float DEFAULT '0',
`discount_desc` varchar(100) DEFAULT NULL,
`discount_starttime` int(11) DEFAULT NULL,
`discount_endtime` int(11) DEFAULT NULL,
`is_online` tinyint(4) DEFAULT '0',
`merchant_id` int(11) NOT NULL,
`picture_url` varchar(255) DEFAULT NULL,
`thumb_picture_url` varchar(255) DEFAULT NULL,
`exchange_points` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=375440 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
表zb_product_attr
CREATE TABLE `zb_product_attr` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`product_id` int(10) unsigned NOT NULL DEFAULT '0',
`attr_id` int(10) unsigned NOT NULL DEFAULT '0',
`attr_value` varchar(255) NOT NULL,
`attr_price` float NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `IX_zb_product_attr` (`product_id`,`attr_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=36812 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
...全文
360 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
懒得去死 2010-03-26
  • 打赏
  • 举报
回复
GROUP BY 的那个表最好有个过滤条件。所以你的语句等于FULL TABLE SCAN.
flyingfree5 2010-03-25
  • 打赏
  • 举报
回复
其实我只想得到zb_product 的数据结果 ,表zb_product_attr只是当查询条件
flyingfree5 2010-03-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 flyingfree5 的回复:]
SELECT a.* FROM zb_product a
LEFT JOIN zb_product_attr b ON a.id=b.product_id
WHERE (b.attr_value LIKE '%白色%') OR (b.attr_value LIKE '%19寸%')
GROUP BY a.id
ORDER BY a.id DESC

zb_product 是主表,zb_……
[/Quote]
如果用了INNER JOIN 会影响 zb_product 的查询结果,表zb_product有数据,表zb_product_attr可能会没有对应的数据,也可以会有对应的多条数据。当zb_product_attr 有查询条件的时候,对应的搜出zb_product的数据 ,当表zb_product_attr 没有查询条件的时候,不影响zb_product原来的显示。所以这里使用了LEFT JOIN .
ACMAIN_CHM 2010-03-25
  • 打赏
  • 举报
回复
SELECT a.* FROM zb_product a
LEFT JOIN zb_product_attr b ON a.id=b.product_id
WHERE (b.attr_value LIKE '%白色%') OR (b.attr_value LIKE '%19寸%')
GROUP BY a.id
ORDER BY a.id DESC

由于是 like '%xxx%' 这种方式,没有索引可以利用,这样,也只有b.product_id这一个索引有用,
另外用LEFT JOIN没有什么意义,不如用INNER JOIN速度会略快一点。
flyingfree5 2010-03-25
  • 打赏
  • 举报
回复
SELECT a.* FROM zb_product a
LEFT JOIN zb_product_attr b ON a.id=b.product_id
WHERE (b.attr_value LIKE '%白色%') OR (b.attr_value LIKE '%19寸%')
GROUP BY a.id
ORDER BY a.id DESC

zb_product 是主表,zb_product_attr是主表的属性, 要求是当查询zb_product_attr 的表中的值时,可以显示主表zb_product中唯一对应ID数据。
ACMAIN_CHM 2010-03-24
  • 打赏
  • 举报
回复
改成这个看你的时间。

SELECT a.* FROM zb_product a
GROUP BY a.id
ORDER BY a.id DESC
flyingfree5 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用楼主 flyingfree5 的回复:]
有两张表,主表 zb_product 数据2万,属性从表 zb_product_attr 20万,根据zb_product_attr 表的属性查询 zb_product 不重复的数据,下面是我写的SQL,查询速度比较慢,请问有什么优化的解决方法?

SELECT a.* FROM zb_product a
LEFT JOIN zb_product_attr b ON a.id=b.produ……
[/Quote]
执行时间:20000 rows fetched in 0.7966s
ACMAIN_CHM 2010-03-24
  • 打赏
  • 举报
回复
[Quote]有可能会从表zb_product_attr 中的列来来做where b.attr_value = "?" 来获取zb_product 的数据 。[/Quote]贴出你真实的SQL语句。否则别人很难分析。
wwwwb 2010-03-24
  • 打赏
  • 举报
回复
你的记录及要求结果贴出来
flyingfree5 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 flyingfree5 的回复:]
引用楼主 flyingfree5 的回复:
有两张表,主表 zb_product 数据2万,属性从表 zb_product_attr 20万,根据zb_product_attr 表的属性查询 zb_product 不重复的数据,下面是我写的SQL,查询速度比较慢,请问有什么优化的解决方法?

SELECT a.* FROM zb_product a
LEFT JOIN zb_product……
[/Quote]
有可能会从表zb_product_attr 中的列来来做where b.attr_value = "?" 来获取zb_product 的数据 。
ACMAIN_CHM 2010-03-24
  • 打赏
  • 举报
回复
SELECT a.* FROM zb_product a
LEFT JOIN zb_product_attr b ON a.id=b.product_id
GROUP BY a.id
ORDER BY a.id DESC

你的执行慢的语句就是这个? 这个语句等同于

SELECT a.* FROM zb_product a
GROUP BY a.id
ORDER BY a.id DESC

56,675

社区成员

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

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