goods_attr商品属性多,引起CPU爆满的问题,盼官方出优化方案!!

2016-07-07 14:55 来源:www.chinab4c.com 作者:ecshop专家

近来的网站打开缓慢,经排查和搜索。。查到goods_attr这个表的问题,
我把这个表清空了,CPU就降下来了。。
可惜的是,这个表是保存商品属性表,我是做服装商城的。都是那些颜色和尺寸属性。每件产品都有颜色和尺码的属性,不可能都删除了。但也没办法,服务器一直跑满100%,所有网站都打开好慢,看了下代码,是category.php这个文件的代码中,涉及属性的代码

  1. /* 扩展商品查询条件 */

  2. if (!empty($filter_attr))
  3. {
  4. $ext_sql = "SELECT DISTINCT(b.goods_id) FROM " . $ecs->table('goods_attr') . " AS a, " . $ecs->table('goods_attr') . " AS b, " . $ecs->table('goods') . " AS g " . "WHERE ";
  5. $ext_group_goods = array();
  6. foreach ($filter_attr AS $k => $v) // 查出符合所有筛选属性条件的商品id
  7. {
  8. if ($v != 0)
  9. {
  10. $sql = $ext_sql . "a.attr_id = b.attr_id AND b.attr_value = a.attr_value AND a.attr_id = " . $cat_filter_attr[$k] ." AND a.goods_attr_id = " . $v;
  11. $ext_group_goods = $db->getCol($sql);
  12. $ext .= ' AND ' . db_create_in($ext_group_goods, 'g.goods_id');
  13. }
  14. }
  15. }
复制代码



百度过其他人给的优化语句,但放进去又出错,对于我这种菜鸟人物来说,再怎么想也想不出个头绪来,唯独等待官方能出个优化的语句,解决这个难题了。
那个代码如下:
  1. /* 扩展商品查询条件 */
  2. $i=0;
  3. if ($filter_attr_arr)
  4. {
  5. /* 查出符合条件商品id */
  6. $attr_con = ' 1 ';
  7. foreach ($filter_attr_arr as $k=>$v)
  8. {
  9. if ($i > 0)
  10. {
  11. $attr_table .= ', '.$ecs->table('goods_attr')." AS a".$i;
  12. $attr_where .= " AND a".$i.".goods_id = a".($i-1).'.goods_id'. " AND ( a".$i.".attr_id = '".$k."' AND a".$i.".attr_value = '$v' ) ";
  13. }
  14. else
  15. {
  16. $attr_table = ' '.$ecs->table('goods').' AS g, '.$ecs->table('goods_attr')." AS a0";
  17. $attr_where = " WHERE g.goods_id = a0.goods_id AND g.is_on_sale = 1 AND g.is_alone_sale = 1 AND g.is_delete = 0 AND ( a0.attr_id = '".$k."' AND a0.attr_value = '$v') ";
  18. }
  19. $i++;
  20. }
  21. $sql = "SELECT DISTINCT(g.goods_id) FROM " . $attr_table .$attr_where;
  22. $col = $db->getCol($sql);
  23. $ext = ' AND ' . db_create_in($col, 'g.goods_id');
  24. }
  25. }
复制代码

转自:http://hi.baidu.com/wangjw302/blog/item/2162c638ec24c5c8d56225af.html
我相信有很多朋友都碰到过这样的问题,如果是虚拟主机,被IDC看到CPU高的情况下,肯定关了网站的,这个问题还是存在。。
我看了最新的版本2.7.1,代码还是原来一样的,没改过。。。
只好求助官方技术大哥能看重这个问题。。如果各位碰到这个问题又有解决办法,希望可以支个招。。在此表示感谢了。。

回答:
感觉问题还是出在mysql上!确实太恼火了点!
数据库结构有待优化!

我的也是啊 。 网站刚刚被关掉了。 产品页的速度非常的慢。空间商说不听的执行一个查询。
SELECT DISTINCT(b.goods_id) FROM `s441418db0`.`ecs_goods_attr` AS a, `s441418db0`.`ecs

DELETE FROM `s441418db0`.`ecs_goods_attr` WHERE goods_id = 0

就是这句了

我的属性表有8000多条记录。

可以确定是这个语句的问题,昨晚我连夜把 一些没用的产品数据删除掉,例如商品回收站的先去掉,因为回收站的商品在属性表goods_attr里是有关联的属性的,一个产品如果5-6个属性的话,300件产品也有2000左右的数据了,清除这个商品回收站后,看到服务器里的CPU终于降下来了。。真累人。。
希望官方能早日优化这个部分的代码,要不对ECSHOP很不利,到时候被空间商封了,说不给用ECSHOP,那就是个真正的杯具了。。

根据楼主提供的代码进行测试。 问题暂时解决。不知道能不能治本。希望官方关注一下这个问题

楼上的,你用那个代码可以运行么,我当时就是放了代码,不过不知道为什么,有语法错误。。

顶下,顶到官方人员来看看。

  1. /* 扩展商品查询条件 */
  2. if (!empty($filter_attr))
  3. {
  4. $ext_sql = "SELECT DISTINCT(b.goods_id) FROM " . $ecs->table('goods_attr') . " AS a, " . $ecs->table('goods_attr') . " AS b, " . $ecs->table('goods') . " AS g " . "WHERE ";
  5. $ext_group_goods = array();

  6. foreach ($filter_attr AS $k => $v) // 查出符合所有筛选属性条件的商品id */
  7. {
  8. if ($v != 0)
  9. {
  10. $sql = $ext_sql . "b.attr_value = a.attr_value AND b.attr_id = " . $cat_filter_attr[$k] ." AND a.goods_attr_id = " . $v;
  11. $ext_group_goods = $db->getCol($sql);
  12. $ext .= ' AND ' . db_create_in($ext_group_goods, 'g.goods_id');
  13. }
  14. }


  15. }
复制代码
更改成
  1. /* 扩展商品查询条件 */
  2. if (!empty($filter_attr))
  3. {
  4. $ext_sql = "SELECT DISTINCT(b.goods_id) FROM " . $ecs->table('goods_attr') . " AS a, " . $ecs->table('goods_attr') . " AS b " ."WHERE ";
  5. $ext_group_goods = array();

  6. foreach ($filter_attr AS $k => $v) // 查出符合所有筛选属性条件的商品id */
  7. {
  8. if ($v != 0)
  9. {
  10. $sql = $ext_sql . "b.attr_value = a.attr_value AND b.attr_id = " . $cat_filter_attr[$k] ." AND a.goods_attr_id = " . $v;
  11. $ext_group_goods = $db->getColCached($sql);
  12. $ext .= ' AND ' . db_create_in($ext_group_goods, 'g.goods_id');
  13. }
  14. }
  15. }

  16. 试下看情况有没好转
复制代码

谁测试了?可行不?

晓天老师给的我还没有测试。楼主给的我测试了,完全可行。今天晚上再测试一下晓天老师的

2。70可行吗,如果完全可以解决问题,请汇总一个最清楚的。

楼主提供的代码,是我原来原创的,现在有更强的更好的优化,优化问题可以联系我

有就贴出来,要收费也直说。

这是通病了,不行可以把这技术卖给ecshop。唉,不知道ecshop有没商业用户。这样的问题都有,一直不解决。

先做个记号

我也遇到同样的问题,用了这个方法好像没有解决。需要升级到最新版么

我的本地打开都很慢
湖南特产