1.select c.* from (select * from `item` where `staus`=0 ORDER BY `dateline` DESC) AS c GROUP BY c.`cid` 这句子查询的效率太低了,数据库有100万数据。
2.SELECT `num_iid`,`title`,`promotion_price`,`price`,`pic_url`,`dateline` FROM `item` WHERE `staus`=0 group by `cid` ORDER BY `dateline` DESC LIMIT 4 这一句order by因为group by的原因会时效。
cid是类目ID
不是,只是最新的5个商品,每个商品的cid不一样
追答我这里不方便创建很多测试数据。
就简单模拟模拟吧
第一条,为什么要用这种语句呢?浪费资源。
看一下这样的语句是否达到预定要求
第二条的话,建议直接取第一条里的cid,再循环取一下,这样更高效。
追问尼玛,难道真的只能这样方法。。。。第一种我肯定不会用,你的这句sql,没有做order by排序,取出的不是最新的肯定不行的。
追答因为你用了子查询,原来表上设置的索引都没用了。性能明显差很多。
你的类别多于5个吗?
每个类别分别取5条数据,然后用order,这样数据量应该小很多吧?
类目有12000个,所以我首先要order by取出5个cid,再去执行5次才行。
追答那我们分析一下,如果我们取100条按odery排序的内容,有多少概率cid超过5?
如果不能够保证100%满足条件,我们把100放大到100%满足的条件的值,然后用这个临时表加索引group?
我想到一个解决方案:
这样是不是能够满足了呢?
这个方式其实也不好,感觉还是回到了原点,这样执行效率其实还真不如单条单条的去执行。
貌似我在本机测试 执行时间达到了0.4s。。。
看一下索引是怎么建的,我觉得这样的语句比你的第一条应该效率高很多吧?
对于这么多的数据量,0.4s我个人觉得还是能够接受的,如果你在服务器上执行的话呢?速度能达多少?
select DISTINCT(`cid`) from `item` where `staus`=0 order by `dateline` DESC LIMIT 0,5
那干嘛不这样?第一条我只是举例说能满足条件,我已经说明了效率不行,肯定不会采用的。
那应该也可以吧?具体的肯定要你权衡一下,有好的方法分享一下,共同进步嘛。