report_viewed_product_index를 자르십시오.


12

잘릴 수있는 테이블 목록 ( /programming/12205714/list-of-tables-to-safely-truncate-in-magento )을 읽고 있었고 보지 못했습니다.

report_viewed_product_index

테이블이 매우 커서 데이터베이스를 복원하는 데 시간이 오래 걸립니다. 이 데이터를 자르거나 가장 오래된 데이터를 제거하는 것이 안전합니까?


1
흥미로운 질문입니다. 나는 얼마 전에 같은 것을 궁금해했다 :)
Anna Völkl

답변:


17

내가 볼 수있는 한이 테이블은 이벤트에 포함되어 log_log_clean_after있습니다.

파일을 보면 app/code/core/Mage/Reports/etc/config.xml다음 스 니펫이 표시됩니다.

<events>
    <log_log_clean_after>
        <observers>
            <reports>
                <class>reports/event_observer</class>
                <method>eventClean</method>
            </reports>
        </observers>
    </log_log_clean_after>
</events>

이 방법은 단순히 모든 보고서 이벤트를 정리 한 다음 제품을보고 비교 한 테이블입니다.

public function eventClean(Varien_Event_Observer $observer)
{
    /* @var $event Mage_Reports_Model_Event */
    $event = Mage::getModel('reports/event');
    $event->clean();

    Mage::getModel('reports/product_index_compared')->clean();
    Mage::getModel('reports/product_index_viewed')->clean();

    return $this;
}

logClean cron 설정이 있는지 확인한 경우 보고서도 정리해야합니다.


좋은 답변, David :)
Anna Völkl

12

우리는 그 테이블에 문제가 있었기 때문에 얼마 전에 이것에 대해 조사했습니다. report_viewed_product_index최근에 본 제품에 사용됩니다. 이 기능을 사용하지 않는 경우 : 이동 및 자르기 :-)

최근에보기 제품 기능을 사용하는 경우 cron이 올바르게 설정되어 있는지 확인하십시오. log/visitor테이블에 더 이상 존재하지 않는 방문자에 대한 항목 은 log_log_clean_after이벤트 에서 자동으로 제거되어야합니다 .

clean 메소드는 이것이 발생 Mage_Reports_Model_Resource_Product_Index_Viewed하는 Mage_Reports_Model_Resource_Product_Index_Abstract위치 에서 상속됩니다 .

/**
 * Clean index (visitor)
 *
 * @return Mage_Reports_Model_Resource_Product_Index_Abstract
 */
public function clean()
{
while (true) {
    $select = $this->_getReadAdapter()->select()
        ->from(array('main_table' => $this->getMainTable()), array($this->getIdFieldName()))
        ->joinLeft(
            array('visitor_table' => $this->getTable('log/visitor')),
            'main_table.visitor_id = visitor_table.visitor_id',
            array())
        ->where('main_table.visitor_id > ?', 0)
        ->where('visitor_table.visitor_id IS NULL')
        ->limit(100);
    $indexIds = $this->_getReadAdapter()->fetchCol($select);

    if (!$indexIds) {
        break;
    }

    $this->_getWriteAdapter()->delete(
        $this->getMainTable(),
        $this->_getWriteAdapter()->quoteInto($this->getIdFieldName() . ' IN(?)', $indexIds)
    );
}
return $this;
}

답이 나쁘지
않은가

흠, 우리는 report_viewed_product_index에서 visitor_id가 NULL 인 레코드가 많이 있습니다.이 레코드는 제거되지 않는 것 같습니다
Jiří Chmiel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.