group by 优化寻求指导

amsea
group by 优化寻求指导

SELECT * FROM info where id in (select owner_id from tags WHERE meta_key = "tag" and meta_value="标签") order by porder desc, visit desc limit 0, 100


SELECT * FROM info a left join tags  b on a.id = b.owner_id WHERE b.meta_key = "tag" and b.meta_value="标签"  order by a.porder desc, a.visit desc limit 0, 100


我靠,这两个sql 太吃资源了。 有什么好的解决方法呢?

标签可能很多,因为会有很多条目打上一个标签啊。

yueliangdao0608
Don't you know this form of order by can not use index search?

amsea
谢谢你的回复。 我发现了这个问题,已经修改并把排序去掉了。 但是性能还是上不来。

amsea
附上 数据情况


info 有 50万条数据
tags有150万条数据
每个info可能有若干个tags

yueliangdao0608
The first select statement can be replaced into the form of join.

[table=95%][tr][td][font=FixedSys][color=#000000][color=#0000FF]SELECT[/color] a[color=#0000CC].[/color][color=#0000CC]*[/color] [color=#0000FF]FROM[/color] info [color=#0000FF]as[/color] a inner join tags [color=#0000FF]as[/color] b on [color=#0000CC]([/color]a[color=#0000CC].[/color]id [color=#0000CC]=[/color] b[color=#0000CC].[/color]owner_id [color=#FF0000]and[/color] b[color=#0000CC].[/color]meta_key [color=#0000CC]=[/color] [color=#0000CC]"[/color]tag[color=#0000CC]"[/color] [color=#FF0000]and[/color] b[color=#0000CC].[/color]meta_value[color=#0000CC]=[/color][color=#0000CC]"[/color]标签[color=#0000CC]"[/color][color=#0000CC])[/color] order by a[color=#0000CC].[/color]porder desc[color=#0000CC],[/color] a[color=#0000CC].[/color]visit desc limit 0[color=#0000CC],[/color] 100[/color][/font][/td][/tr][/table]

yueliangdao0608
The second sql statement used the left join.
So the left table had to do a full table scan.

chuhongze
[quote]原帖由 [i]amsea[/i] 于 2008-6-2 12:52 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8485408&ptid=1120642][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
SELECT * FROM info where id in (select owner_id from tags WHERE meta_key = "tag" and meta_value="标签") order by porder desc, visit desc limit 0, 100


SELECT * FROM info a left join tags  b  ... [/quote]



LZ,你说的资源是什么资源:数据库、CPU还是SELECT太慢,SELECT一次的时间是多少?

yueliangdao0608
[quote]原帖由 [i]chuhongze[/i] 于 2008-6-4 14:27 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8514907&ptid=1120642][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]




LZ,你说的资源是什么资源:数据库、CPU还是SELECT太慢,SELECT一次的时间是多少? [/quote]

It oughts to be cpu.:mrgreen:

amsea
[quote]原帖由 [i]yueliangdao0608[/i] 于 2008-6-4 13:53 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8514380&ptid=1120642][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
The first select statement can be replaced into the form of join.

SELECT a.* FROM info as a inner join tags as b on (a.id = b.owner_id and b.meta_key = "tag" and b.meta_value="标签") order by  ... [/quote]



Using where; Using temporary; Using filesort

还是不行,呵呵。

amsea
回复 #7 chuhongze 的帖子

CPU 、时间和磁盘操作。 都被拖累。
后来发现表结构有些问题,索引也有些问题。

减少了 meta_VALUE 的字段长度(varchar类型)
两个表的主键(ID ) 改为 数字 自增主键。

amsea
这个排序 要不得。 去掉排序 问题基本解决。  需要用临时表 和文件排序的两个 都是因为排序造成的。