mysql 大数据表如何查询不重复字段记录


数据库为MySQL--MyISAM
数据表有如下字段:
id, item_id, item_pic, item_title, shop_nick, biz30day, comment_count, shop_url, rebate, price, commission_rate, commission, spread30day, commission30day, key_id, create_time

!!!想要查询 item_id不相同 按销量倒序排序的 所有商品数据

select item_id , item_pic , shop_nick , item_title , biz30day , price , count(distinct item_id ) from key_alimama_items group by item_id ORDER BY key_alimama_items . biz30day DESC

查询时间太长了 超过五秒

现在零时用的sql语句(取biz30day销量大于5000的):
select item_id , item_pic , shop_nick , item_title , biz30day , price , count(distinct item_id ) from key_alimama_items where biz30day>5000 group by item_id ORDER BY key_alimama_items . biz30day DESC
执行时间约0.2~1.2秒
但是有如下缺陷 如果单类商品 最大销量的商品都小于5000就取不到数据
或者月初销量清零从新计算也取不到数据

在网上找了很多其他查询语句 要么是数据库直接卡死奔溃 要么就是超过十秒。
希望德问的技术达人帮忙解决 这个效率问题。

数据库 mysql

小三头黄金龙 10 years, 10 months ago
   
  select item_id,item_pic,shop_nick,item_title,biz30day, price, count(distinct item_id)
  
from key_alimama_items
group by item_id
ORDER BY key_alimama_items.biz30day DESC

我的看法, 首先楼主你需要仔细验证一下你的sql.
1). 你用item_id分组, 然后select里, item_pic,shop_nick,item_title,biz30day, price这些字段都不在 聚集函数里面; 这个在标准sql里是不允许的; mysql通过group by extension可以这么做, 但不知道是不是你想要的结果.
2). 用item_id分组后, select里的count(distinct item_id) 非常诡异啊, hmm... 返回一定是1吧.

至于为什么sql慢, 我想主要在group by, order by上, explain应该会看到Using temporary; Using filesort; 你也可以show profile看一下
http://dev.mysql.com/doc/refman/5.5/en/show-profile.html

聰明的小帥哥 answered 10 years, 10 months ago

Your Answer