You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Magento 1.9.x重复SQL查询致CPU占用飙升求助

解决Magento 1.9.x中重复SQL查询导致CPU飙升的问题

我之前维护Magento 1.9站点时碰到过一模一样的情况——那个带IF判断的EAV属性查询反复执行,直接把数据库CPU拉到100%,当时也只能靠重启服务器应急,后来摸索出几个靠谱的解决办法,分享给你:

1. 先定位问题根源

  • 用MySQL命令抓取当前进程:SHOW PROCESSLIST;,看看这个查询是从哪个请求触发的。另外建议打开慢查询日志,方便后续排查:
    SET GLOBAL slow_query_log = 1;
    SET GLOBAL long_query_time = 1;
    
    这个查询大多出现在产品列表页、分类页,或者后台批量操作场景,尤其是当Varnish缓存没生效,大量请求直接穿透到Magento的时候。
  • 检查Varnish缓存命中率:执行varnishstat -1 | grep cache_hit,如果命中率低于90%,先调整Varnish配置,比如优化Cookie规则,别让不必要的请求跳过缓存。

2. 优化Magento内置缓存与EAV逻辑

  • 立刻检查后台缓存状态:进入System -> Cache Management,把所有生产环境可用的缓存(尤其是EAV Attribute Cache和Block HTML Output)全部开启,这能大幅减少重复查询的次数。
  • 如果是自定义模块频繁调用产品属性,手动加缓存:比如把属性查询结果存到Magento的缓存系统里,示例代码:
    $cacheKey = 'product_is_active_' . $productId;
    $isActive = Mage::app()->getCache()->load($cacheKey);
    if (!$isActive) {
        // 执行你的属性查询逻辑
        $isActive = ...;
        Mage::app()->getCache()->save($isActive, $cacheKey, array('product_cache'), 86400);
    }
    

3. 数据库层面优化

  • 给EAV属性表加联合索引:如果is_active是int类型属性,对应的表是catalog_product_entity_int,执行以下SQL添加索引:
    ALTER TABLE `catalog_product_entity_int` ADD INDEX `IDX_ATTRIBUTE_ENTITY` (`attribute_id`, `entity_id`);
    
    这能加速属性值的查询速度,减少数据库CPU占用。
  • 清理冗余日志表:Magento的log_url、log_visitor等日志表如果太大,会拖慢整个数据库,定期清理或者在后台System -> Configuration -> Advanced -> System -> Log Cleaning里开启自动清理。

4. 应急方案(不用重启整台服务器)

  • 杀掉重复的MySQL进程:先执行mysqladmin processlist找到对应查询的进程ID,然后用mysqladmin kill [进程ID]杀掉,快速缓解CPU压力。
  • 单独重启服务:只重启Apache和Varnish就行,命令分别是service apache2 restart和service varnish restart,比重启整台服务器高效得多。

内容的提问来源于stack exchange,提问作者John Doe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:43:30