Magento 1.9.x重复SQL查询致CPU占用飙升求助
解决Magento 1.9.x中重复SQL查询导致CPU飙升的问题
我之前维护Magento 1.9站点时碰到过一模一样的情况——那个带IF判断的EAV属性查询反复执行,直接把数据库CPU拉到100%,当时也只能靠重启服务器应急,后来摸索出几个靠谱的解决办法,分享给你:
1. 先定位问题根源
- 用MySQL命令抓取当前进程:
SHOW PROCESSLIST;,看看这个查询是从哪个请求触发的。另外建议打开慢查询日志,方便后续排查:
这个查询大多出现在产品列表页、分类页,或者后台批量操作场景,尤其是当Varnish缓存没生效,大量请求直接穿透到Magento的时候。SET GLOBAL slow_query_log = 1; SET GLOBAL long_query_time = 1; - 检查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添加索引:
这能加速属性值的查询速度,减少数据库CPU占用。ALTER TABLE `catalog_product_entity_int` ADD INDEX `IDX_ATTRIBUTE_ENTITY` (`attribute_id`, `entity_id`); - 清理冗余日志表: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
相关产品推荐
相关产品推荐

