mysql order by/group by 优化

hzhsky1985 2009-11-20 12:22:32
explain select im.item_id from property_value p left join item i on p.id = i.value left join
item_message im on i.item_id = im.item_id where ( p.value like '%餐饮%' or p.value like '%拉%' ) and im.class = 1 and im.status = 0 and p.`property_id` in (SELECT id FROM
`property` WHERE `key_p` = 1) LIMIT 24 , 8


id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY im ref class,item_id class 4 const 9096 Using where
1 PRIMARY i ref value,item_id item_id 4 fenlei.im.item_id 8 Using where
1 PRIMARY p eq_ref PRIMARY PRIMARY 4 fenlei.i.value 1 Using where
2 DEPENDENT SUBQUERY property unique_subquery PRIMARY PRIMARY 4 func 1 Using where


explain select count(im.item_id), im.item_id from property_value p left join item i on p.id = i.value left join
item_message im on i.item_id = im.item_id where ( p.value like '%餐饮%' or p.value like '%拉%' ) and im.class = 1 and im.status = 0 and p.`property_id` in (SELECT id FROM
`property` WHERE `key_p` = 1) group by im.item_id LIMIT 20 , 8

id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY im index class,item_id item_id 4 NULL 3 Using where
1 PRIMARY i ref value,item_id item_id 4 fenlei.im.item_id 8 Using where
1 PRIMARY p eq_ref PRIMARY PRIMARY 4 fenlei.i.value 1 Using where
2 DEPENDENT SUBQUERY property unique_subquery PRIMARY PRIMARY 4 func 1 Using where

explain select count(im.item_id), im.item_id from property_value p left join item i on p.id = i.value left join
item_message im on i.item_id = im.item_id where ( p.value like '%餐饮%' or p.value like '%拉%') and im.class = 1 and im.status = 0 and p.`property_id` in (SELECT id FROM
`property` WHERE `key_p` = 1) group by im.item_id order by count(im.item_id) LIMIT 20 , 8

id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY im index class,item_id item_id 4 NULL 3 Using where; Using temporary; Using filesort
1 PRIMARY i ref value,item_id item_id 4 fenlei.im.item_id 8 Using where
1 PRIMARY p eq_ref PRIMARY PRIMARY 4 fenlei.i.value 1 Using where
2 DEPENDENT SUBQUERY property unique_subquery PRIMARY PRIMARY 4 func 1 Using where

我要用得第3条sql,我要order by的是count(im.item_id)这个数,请问如何优化,附索引,谢谢

SHOW INDEX FROM item_message

Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
item_message 0 PRIMARY 1 id A 11994 NULL NULL BTREE
item_message 1 class 1 class A 3 NULL NULL BTREE
item_message 1 regional 1 regional A 3 NULL NULL YES BTREE
item_message 1 city 1 city A 11 NULL NULL YES BTREE
item_message 1 regional_city 1 regional A 3 NULL NULL YES BTREE
item_message 1 regional_city 2 city A 11 NULL NULL YES BTREE
item_message 1 create_date 1 create_date A 3 NULL NULL YES BTREE
item_message 1 item_id 1 item_id A 11994 NULL NULL BTREE

SHOW INDEX FROM item

Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
item 0 PRIMARY 1 id A 1148679 NULL NULL BTREE
item 0 value 1 value A 1148679 NULL NULL BTREE
item 1 item_id 1 item_id A 143584 NULL NULL BTREE
item 1 class_id 1 class_id A 3 NULL NULL BTREE

SHOW INDEX FROM property_value

Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
property_value 0 PRIMARY 1 id A 1149757 NULL NULL BTREE
property_value 1 property_id 1 property_id A 23 NULL NULL BTREE
property_value 1 property_id 2 value A 6495 255 NULL BTREE
property_value 1 value 1 value NULL 4892 NULL NULL FULLTEXT


...全文
217 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
hzhsky1985 2009-11-20
  • 打赏
  • 举报
回复
太长吗?那从第3句sql看起就可以了.......前面2句只是用来说明情况,可以不理会的,谢谢各位拉
gaojia2004 2009-11-20
  • 打赏
  • 举报
回复
头昏 不研究
好汉坡 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xming4321 的回复:]
哇色 这么长啊 头晕
[/Quote].
十一文 2009-11-20
  • 打赏
  • 举报
回复
哇色 这么长啊 头晕
ACMAIN_CHM 2009-11-20
  • 打赏
  • 举报
回复
order by count() 这种在这一层上是无法再优化了的了。 只有所有符合条件的记录都遍历过后才能有结果。
hzhsky1985 2009-11-20
  • 打赏
  • 举报
回复
可还是远远不及要求啊,看来这个算法在我现阶段还用不了,数据库要抽来健了
vinsonshen 2009-11-20
  • 打赏
  • 举报
回复
order by的是count(im.item_id)

-------------
因为count(im.item_id)这个新生成的值,所以这个只能内部会将查询结果防进临时表然后再排序,所以,这里面现有的基础上不用优化了

另外,看你的执行计划,效果不错啊

pbsh 2009-11-20
  • 打赏
  • 举报
回复
MySQL研究不深,等高手。
hzhsky1985 2009-11-20
  • 打赏
  • 举报
回复
upup
xiangchengboy 2009-11-20
  • 打赏
  • 举报
回复
太长,头晕!
--小F-- 2009-11-20
  • 打赏
  • 举报
回复
MYSQL 有请P梁
icelovey 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hero__stone 的回复:]
引用 1 楼 xming4321 的回复:
哇色 这么长啊 头晕
.
[/Quote]没用过MY SQL 帮顶吧
hzhsky1985 2009-11-20
  • 打赏
  • 举报
回复
upup

56,675

社区成员

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

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