php mysql优化 这个执行效率太低了 怎么优化一下这个sql呀
$sql = "SELECT count(g.goods_id) as gnum ,sum(g.click_count) as cg,ga.attr_value,u.user_id, u.user_name, sum(
og.goods_number * og.goods_price
) AS sumprice,
sum(
og.goods_number * og.goods_price - (og.sell_fee + og.tosell_fee + og.photo_fee)
) AS rprice,
sum(
og.sell_fee + og.tosell_fee + og.photo_fee
) AS profit,
max(from_unixtime( o.pay_time +28800)) AS paytime,
su.su_name,g.supplier_id,su.site_url,count(*) as sale_num
FROM ecs_order_goods AS og
LEFT JOIN ecs_goods AS g ON og.goods_id = g.goods_id
LEFT JOIN ecs_order_info AS o ON og.order_id = o.order_id
LEFT JOIN ecs_suppliers AS su ON g.supplier_id = su.su_id
LEFT JOIN ecs_users AS u ON su.user_id = u.user_id
LEFT JOIN ecs_pay_records AS pr ON pr.goods_id = og.goods_id
LEFT JOIN ecs_goods_attr AS ga ON og.goods_id=ga.goods_id
LEFT JOIN ecs_attribute AS a ON a.attr_id = ga.attr_id
WHERE 1
AND g.cat_id IN ('225','228','242','349','352','429','646','647','649','668','678','677','676','675','674','673','684','683','682','672','671','670','669','681','680','679','648','664','667','666','665','663','662','661','655','660','659','658','657','654','652','651','650','656','653','192','304','316','317','318','319','320','305','626','627','628','307','336','631','337','338','306','302','301','623','624','625')
AND o.order_status = '1'
AND o.pay_status ='2'
AND pr.action=1
AND a.attr_name='作者姓名'
AND ga.attr_value='".$name."'
GROUP BY ga.attr_value ORDER BY sumprice DESC LIMIT 1";
追问:我想要一个明确的答案 我这里优化不了 怎么做没有的话 我问干嘛呀 高手!!! 能解决一下吗?怎么分批查询呀 这个索引我都 已经加上了 你的sql不好用 谢谢 你再 看看
答案:你的左连接生成中间表时数据太多了,过滤条件在ON中去过滤。
改成下边的语句试试。还不行的话,考虑对表加索引。
SELECT count(g.goods_id) as gnum ,sum(g.click_count) as cg,ga.attr_value,u.user_id, u.user_name, sum(
og.goods_number * og.goods_price
) AS sumprice,
sum(
og.goods_number * og.goods_price - (og.sell_fee + og.tosell_fee + og.photo_fee)
) AS rprice,
sum(
og.sell_fee + og.tosell_fee + og.photo_fee
) AS profit,
max(from_unixtime( o.pay_time +28800)) AS paytime,
su.su_name,g.supplier_id,su.site_url,count(*) as sale_num
FROM ecs_order_goods AS og
LEFT JOIN ecs_goods AS g ON og.goods_id = g.goods_id AND g.cat_id IN ('225','228','242','349','352','429','646','647','649','668','678','677','676','675','674','673','684','683','682','672','671','670','669','681','680','679','648','664','667','666','665','663','662','661','655','660','659','658','657','654','652','651','650','656','653','192','304','316','317','318','319','320','305','626','627','628','307','336','631','337','338','306','302','301','623','624','625')
LEFT JOIN ecs_order_info AS o ON og.order_id = o.order_id AND o.order_status = '1' AND o.pay_status ='2'
LEFT JOIN ecs_suppliers AS su ON g.supplier_id = su.su_id
LEFT JOIN ecs_users AS u ON su.user_id = u.user_id
LEFT JOIN ecs_pay_records AS pr ON pr.goods_id = og.goods_id AND pr.action=1
LEFT JOIN ecs_goods_attr AS ga ON og.goods_id=ga.goods_id AND a.attr_name='作者姓名' AND ga.attr_value='".$name."'
LEFT JOIN ecs_attribute AS a ON a.attr_id = ga.attr_id
GROUP BY ga.attr_value ORDER BY sumprice DESC LIMIT 1
其他:mysql建议,多查询几次,一个一个查询就不会有这么长了,。另外一种就是写个存储过程。 你的应用有问题。有这种功能需求吗? 从sql逻辑上优化的空间不大,max(from_unixtime( o.pay_time +28800)) 改为
max(from_unixtime( o.pay_time )) +28800。
另外,检查一下,你关联的那些表,有没有索引。
上一个:mysql效率问题
下一个:mysql 不能创建表 errno:150 帮我看下什么问题