Magento core_url_rewrite表过大


105

我注意到大量报告称此表本身可能变得非常混乱,我正在运行一个站点,该站点具有约5000个SKU和约250个类别(单个存储),结果core_url_rewrite表超过600,000行,且表超过500MB,疯了

这可能会降低站点性能,并导致数据库非常庞大。我做了一些挖掘,发现了很多与此相关的帖子,最值得注意的是:

//自新板实施以来,这些链接已被删除

现在我知道该表可以被截断并重新建立索引,但这并不能解决问题,只是延长了问题再次发生的时间。

据我了解,部分问题是产品具有基于产品名称的相同url键,从而导致建立索引链接。

提到的解决方法是:

app/code/core/Mage/Catalog/Model/Url.php 线上〜807:

更改:

 if ($product->getUrlKey() == '' && !empty($requestPath)
       && strpos($existingRequestPath, $requestPath) === 0
 ) 

至:

 if (!empty($requestPath)
       && strpos($existingRequestPath, $requestPath) === 0
 ) 

但这甚至不能完全解决问题。

我的问题如下:

如果您遇到此问题,您是否能够建立一种有效,逻辑和高效的算法,而无需反复“管理”该问题,而实际上是一劳永逸地解决问题?

非常感谢您对此有所了解。

顺便说一句:请帮个忙,检查一下您的桌子现在是什么样子,您可能会遇到此问题,并因此而对性能产生影响,我什至不知道-我不知道。

编辑:我已经与www.Nexcess.net(Magento铂金托管合作伙伴)进行了联系,他们已经确认,他们已经要求客户core_url_rewrite由于过于庞大而要求将桌子截断。

我最担心的是这可能会对SEO产生影响,这就是为什么我想要一个解决方案,而不是再次拖延问题的原因。

更新: Nexcess提到表中有重复的产品,实际上可能会实际上损害SEO。


哇,那张桌子真大。我检查了自己的产品(200种产品),它只有约800行,但是我们没有重复产品名称/ URL的问题。作为参考,每个可见产品大约有6.6行。我承认这并不是一个可怕的现实比较,但是按照这样的速度,对于5,000种产品,我们大约只有30,000行左右。我可以很好地理解您对解决方案的需求,并且在我将要实施一个更大的站点时,将会看到这个问题。
Pete855217 2014年

@ Pete855217:这个问题听起来很有趣,即使您尚未对其进行投票。
Mohammad Faisal 2014年

1
EE1.12中存在一个错误,该错误会导致每次保存都重新创建重写。您的1.7版本可能有相同的错误。我记得针对1.12的补丁也适用于1.7
brentwpeterson

1
非常有帮助的文章!我们有13万种有效产品,以及25,000种禁用产品,我们的core_url_rewrite_table中有2744023条记录....因此,本周我们将着手解决这个问题!本文看来是一个不错的起点。
MagentoMac 2014年

编辑了帖子,以包括如何不删除Magento中的自定义重写。
espradley,2015年

Answers:


76

我设法解决了这个问题,如下所示:

步骤1:重写Catalog URL模型(使用您自己的模块:How To

注意:如果您不使用重写就覆盖了核心文件,这将使您的Magento实例无法进行未来的升级。

根据詹尼的解决方案 MagentoCommerce董事会(在新板上不再有效),app/code/core/Mage/Catalog/Model/Url.php[围绕第807行Mage_Catalog_Model_Url::getProductRequestPath()]

从:

if ($product->getUrlKey() == '' && !empty($requestPath)
   && strpos($existingRequestPath, $requestPath) === 0
) 

至:

if (!empty($requestPath)
           && strpos($existingRequestPath, $requestPath) === 0
) 

步骤2:截断

截断core_url_rewrite表格

步骤3:重新编制索引并刷新缓存

在Core URL Rewrites上启动重新索引过程。之后,您将要刷新Magento缓存和存储缓存。

System→交通Cache Management→交通Flush Magento Cache

System→交通Cache Management→交通Flush Cache Storage

瞧,您都准备好了。您会注意到,如果您重新运行索引器,则表的大小应保持不变(除非您在两者之间添加了更多产品,或者您具有重复的类别名称)。


5
太好了,我的core_url_rewrite表为3.2 GB,现在是36.8 MB:D由
偶人

我有一个类似的问题。Magento URL重写在Url中附加随机数。请查看Google网站主工具附带的屏幕截图。如您所见,产品“米色绣花纱丽”具有9个不同的URL,但它只是一种产品,并且仅指向一个以878结尾的URL。实际的URL密钥末尾没有随机数(附有截屏) )。我的商店相当新,而core_url_rewrite的大小并不大。因此,我不确定是否应该继续执行步骤1和2或仅执行步骤1。如果执行步骤2,我将丢失自定义重写。
Zoya 2015年


2
我将首先导出现有表。然后,我将继续执行步骤1、2和3。core_url_rewrite现在看一下表,记下记录数。再次运行步骤3(重新索引),然后刷新core_url_rewrite表上的视图。如果数字相同,则说明您已成功解决。然后继续并手动合并您的自定义重写。祝一切顺利。
驼鹿2015年

2
此修复程序仅适用于产品,不适用于具有相同URL密钥的类别。参见@Simon的答案以获得更好的解决方案(带有补丁文件)
Giel Berkers 2015年

45

我希望这里有人提出答案,但我不知道您会找到答案。由于许多不同的原因,这张桌子变大了。Magento的早期(可能是当前)版本中的错误是其中之一。另一个是此表中的逻辑试图跟踪URL密钥值的更改,以便为旧产品设置301/302重写。因此,复杂的事情是,截断表并重新生成可能会使现有的URL重写消失,并且这将对您的搜索引擎列表产生未知的影响(不一定很糟糕,只是很难预测)。

我对提出要求的客户的一般建议是

  1. 如果您无法很好地处理URL / SEO情况,请保持巨大的增长表

  2. 在表大小开始成为问题之前(例如,生成站点地图)。发生这种情况时,请处理您的URL / SEO情况。

  3. 处理完URL / SEO情况后,备份表,然后截断表并重新生成。解决由截断引起的任何URL / SEO问题。

  4. 自动化步骤3

尝试在Magento代码级别上解决此问题是令人钦佩的,但是您将向上游进发。有时最好接受“这就是Magento就是Magento”,并解决外部流程问题。


谢谢您的建议,对于这种情况我感到遗憾,但是我确实认为这将必须由您提到的外部流程来处理,敦促。
驼鹿2014年

2
这个巨大的表已经可能引起SEO问题,因为给定产品的规范会不断变化。如果您针对移动设备和台式机使用单独的商店视图,那么情况会更糟,因为它们的网址会有所不同。
梅尔文

有点令人失望的回答我...
法兰克福机场

@Alan Storm,发布此答案后,您对穆斯发布的答案有何感想?您看到同样的风险吗?
Goose Goose

24

我想为这个网址重写索引器错误添加一个修复程序,该修复程序是在2013年3月的Bugathon上开发的,之后又得到了进一步的改进。它应该解决这个问题。作为参考,以下是链接中的补丁文件:

diff -rupN mage_org/app/code/core/Mage/Catalog/Model/Url.php src_shop/app/code/core/Mage/Catalog/Model/Url.php
--- mage_org/app/code/core/Mage/Catalog/Model/Url.php   2013-11-19 00:48:25.679009391 +0100
+++ src_shop/app/code/core/Mage/Catalog/Model/Url.php   2013-11-19 00:49:24.188005601 +0100
@@ -643,13 +643,24 @@ class Mage_Catalog_Model_Url
                 $this->_rewrite = $rewrite;
                 return $requestPath;
             }
+
+            // avoid unnecessary creation of new url_keys for duplicate url keys
+            $noSuffixPath = substr($requestPath, 0, -(strlen($suffix)));
+            $regEx = '#^('.preg_quote($noSuffixPath).')(-([0-9]+))?('.preg_quote($suffix).')#i';
+            $currentRewrite = $this->getResource()->getRewriteByIdPath($idPath, $storeId);
+            if ($currentRewrite && preg_match($regEx, $currentRewrite->getRequestPath(), $match)) {
+                $this->_rewrite = $currentRewrite;
+                return $currentRewrite->getRequestPath();
+            }
+
             // match request_url abcdef1234(-12)(.html) pattern
             $match = array();
             $regularExpression = '#^([0-9a-z/-]+?)(-([0-9]+))?('.preg_quote($suffix).')?$#i';
             if (!preg_match($regularExpression, $requestPath, $match)) {
                 return $this->getUnusedPath($storeId, '-', $idPath);
             }
-            $match[1] = $match[1] . '-';
+            $match[1] = $noSuffixPath . '-'; // always use full prefix of url_key
+            unset($match[3]); // don't start counting with a possible number in the url_key
             $match[4] = isset($match[4]) ? $match[4] : '';

             $lastRequestPath = $this->getResource()


另外,我想添加EE补丁PATCH_SUPEE-389_EE_1.12.0.2_v2.sh,该补丁现在可以在GitHub找到

#!/bin/bash
# Patch apllying tool template
# v0.1.2
# (c) Copyright 2013. Magento Inc.
#
# DO NOT CHANGE ANY LINE IN THIS FILE.

# 1. Check required system tools
_check_installed_tools() {
    local missed=""

    until [ -z "$1" ]; do
        type -t $1 >/dev/null 2>/dev/null
        if (( $? != 0 )); then
            missed="$missed $1"
        fi
        shift
    done

    echo $missed
}

REQUIRED_UTILS='sed patch'
MISSED_REQUIRED_TOOLS=`_check_installed_tools $REQUIRED_UTILS`
if (( `echo $MISSED_REQUIRED_TOOLS | wc -w` > 0 ));
then
    echo -e "Error! Some required system tools, that are utilized in this sh script, are not installed:\nTool(s) \"$MISSED_REQUIRED_TOOLS\" is(are) missed, please install it(them)."
    exit 1
fi

# 2. Determine bin path for system tools
CAT_BIN=`which cat`
PATCH_BIN=`which patch`
SED_BIN=`which sed`
PWD_BIN=`which pwd`
BASENAME_BIN=`which basename`

BASE_NAME=`$BASENAME_BIN "$0"`

# 3. Help menu
if [ "$1" = "-?" -o "$1" = "-h" -o "$1" = "--help" ]
then
    $CAT_BIN << EOFH
Usage: sh $BASE_NAME [--help] [-R|--revert] [--list]
Apply embedded patch.

-R, --revert    Revert previously applied embedded patch
--list          Show list of applied patches
--help          Show this help message
EOFH
    exit 0
fi

# 4. Get "revert" flag and "list applied patches" flag
REVERT_FLAG=
SHOW_APPLIED_LIST=0
if [ "$1" = "-R" -o "$1" = "--revert" ]
then
    REVERT_FLAG=-R
fi
if [ "$1" = "--list" ]
then
    SHOW_APPLIED_LIST=1
fi

# 5. File pathes
CURRENT_DIR=`$PWD_BIN`/
APP_ETC_DIR=`echo "$CURRENT_DIR""app/etc/"`
APPLIED_PATCHES_LIST_FILE=`echo "$APP_ETC_DIR""applied.patches.list"`

# 6. Show applied patches list if requested
if [ "$SHOW_APPLIED_LIST" -eq 1 ] ; then
    echo -e "Applied/reverted patches list:"
    if [ -e "$APPLIED_PATCHES_LIST_FILE" ]
    then
        if [ ! -r "$APPLIED_PATCHES_LIST_FILE" ]
        then
            echo "ERROR: \"$APPLIED_PATCHES_LIST_FILE\" must be readable so applied patches list can be shown."
            exit 1
        else
            $SED_BIN -n "/SUP-\|SUPEE-/p" $APPLIED_PATCHES_LIST_FILE
        fi
    else
        echo "<empty>"
    fi
    exit 0
fi

# 7. Check applied patches track file and its directory
_check_files() {
    if [ ! -e "$APP_ETC_DIR" ]
    then
        echo "ERROR: \"$APP_ETC_DIR\" must exist for proper tool work."
        exit 1
    fi

    if [ ! -w "$APP_ETC_DIR" ]
    then
        echo "ERROR: \"$APP_ETC_DIR\" must be writeable for proper tool work."
        exit 1
    fi

    if [ -e "$APPLIED_PATCHES_LIST_FILE" ]
    then
        if [ ! -w "$APPLIED_PATCHES_LIST_FILE" ]
        then
            echo "ERROR: \"$APPLIED_PATCHES_LIST_FILE\" must be writeable for proper tool work."
            exit 1
        fi
    fi
}

_check_files

# 8. Apply/revert patch
# Note: there is no need to check files permissions for files to be patched.
# "patch" tool will not modify any file if there is not enough permissions for all files to be modified.
# Get start points for additional information and patch data
SKIP_LINES=$((`$SED_BIN -n "/^__PATCHFILE_FOLLOWS__$/=" "$CURRENT_DIR""$BASE_NAME"` + 1))
ADDITIONAL_INFO_LINE=$(($SKIP_LINES - 3))p

_apply_revert_patch() {
    DRY_RUN_FLAG=
    if [ "$1" = "dry-run" ]
    then
        DRY_RUN_FLAG=" --dry-run"
        echo "Checking if patch can be applied/reverted successfully..."
    fi
    PATCH_APPLY_REVERT_RESULT=`$SED_BIN -e '1,/^__PATCHFILE_FOLLOWS__$/d' "$CURRENT_DIR""$BASE_NAME" | $PATCH_BIN $DRY_RUN_FLAG $REVERT_FLAG -p0`
    PATCH_APPLY_REVERT_STATUS=$?
    if [ $PATCH_APPLY_REVERT_STATUS -eq 1 ] ; then
        echo -e "ERROR: Patch can't be applied/reverted successfully.\n\n$PATCH_APPLY_REVERT_RESULT"
        exit 1
    fi
    if [ $PATCH_APPLY_REVERT_STATUS -eq 2 ] ; then
        echo -e "ERROR: Patch can't be applied/reverted successfully."
        exit 2
    fi
}

REVERTED_PATCH_MARK=
if [ -n "$REVERT_FLAG" ]
then
    REVERTED_PATCH_MARK=" | REVERTED"
fi

_apply_revert_patch dry-run
_apply_revert_patch

# 9. Track patch applying result
echo "Patch was applied/reverted successfully."
ADDITIONAL_INFO=`$SED_BIN -n ""$ADDITIONAL_INFO_LINE"" "$CURRENT_DIR""$BASE_NAME"`
APPLIED_REVERTED_ON_DATE=`date -u +"%F %T UTC"`
APPLIED_REVERTED_PATCH_INFO=`echo -n "$APPLIED_REVERTED_ON_DATE"" | ""$ADDITIONAL_INFO""$REVERTED_PATCH_MARK"`
echo -e "$APPLIED_REVERTED_PATCH_INFO\n$PATCH_APPLY_REVERT_RESULT\n\n" >> "$APPLIED_PATCHES_LIST_FILE"

exit 0


SUPEE-389 | EE_1.12.0.2 | v1 | 53c8ca52583358953b143aaa1a78cf409e8dd846 | Thu Jun 20 10:36:39 2013 +0300 | v1.12.0.2..HEAD

__PATCHFILE_FOLLOWS__
diff --git app/code/core/Mage/Catalog/Model/Url.php app/code/core/Mage/Catalog/Model/Url.php
index fa55fc5..a755b46 100644
--- app/code/core/Mage/Catalog/Model/Url.php
+++ app/code/core/Mage/Catalog/Model/Url.php
@@ -609,6 +609,23 @@ class Mage_Catalog_Model_Url
      */
     public function getUnusedPath($storeId, $requestPath, $idPath)
     {
+        $urlKey = '';
+        return $this->getUnusedPathByUrlkey($storeId, $requestPath, $idPath, $urlKey);
+    }
+
+    /**
+     * Get requestPath that was not used yet.
+     *
+     * Will try to get unique path by adding -1 -2 etc. between url_key and optional url_suffix
+     *
+     * @param int $storeId
+     * @param string $requestPath
+     * @param string $idPath
+     * @param string $urlKey
+     * @return string
+     */
+    public function getUnusedPathByUrlkey($storeId, $requestPath, $idPath, $urlKey = '')
+    {
         if (strpos($idPath, 'product') !== false) {
             $suffix = $this->getProductUrlSuffix($storeId);
         } else {
@@ -645,21 +662,22 @@ class Mage_Catalog_Model_Url
             }
             // match request_url abcdef1234(-12)(.html) pattern
             $match = array();
-            $regularExpression = '#^([0-9a-z/-]+?)(-([0-9]+))?('.preg_quote($suffix).')?$#i';
+            $regularExpression = '#(?P<prefix>(.*/)?' . preg_quote($urlKey) . ')(-(?P<increment>[0-9]+))?(?P<suffix>'
+                . preg_quote($suffix) . ')?$#i';
             if (!preg_match($regularExpression, $requestPath, $match)) {
-                return $this->getUnusedPath($storeId, '-', $idPath);
+                return $this->getUnusedPathByUrlkey($storeId, '-', $idPath, $urlKey);
             }
-            $match[1] = $match[1] . '-';
-            $match[4] = isset($match[4]) ? $match[4] : '';
+            $match['prefix'] = $match['prefix'] . '-';
+            $match['suffix'] = isset($match['suffix']) ? $match['suffix'] : '';

             $lastRequestPath = $this->getResource()
-                ->getLastUsedRewriteRequestIncrement($match[1], $match[4], $storeId);
+                ->getLastUsedRewriteRequestIncrement($match['prefix'], $match['suffix'], $storeId);
             if ($lastRequestPath) {
-                $match[3] = $lastRequestPath;
+                $match['increment'] = $lastRequestPath;
             }
-            return $match[1]
-                . (isset($match[3]) ? ($match[3]+1) : '1')
-                . $match[4];
+            return $match['prefix']
+                . (isset($match['increment']) ? ($match['increment']+1) : '1')
+                . $match['suffix'];
         }
         else {
             return $requestPath;
@@ -699,7 +717,7 @@ class Mage_Catalog_Model_Url
     {
         $storeId = $category->getStoreId();
         $idPath  = $this->generatePath('id', null, $category);
-        $suffix  = $this->getCategoryUrlSuffix($storeId);
+        $categoryUrlSuffix = $this->getCategoryUrlSuffix($storeId);

         if (isset($this->_rewrites[$idPath])) {
             $this->_rewrite = $this->_rewrites[$idPath];
@@ -713,27 +731,27 @@ class Mage_Catalog_Model_Url
             $urlKey = $this->getCategoryModel()->formatUrlKey($category->getUrlKey());
         }

-        $categoryUrlSuffix = $this->getCategoryUrlSuffix($category->getStoreId());
         if (null === $parentPath) {
             $parentPath = $this->getResource()->getCategoryParentPath($category);
         }
         elseif ($parentPath == '/') {
             $parentPath = '';
         }
-        $parentPath = Mage::helper('catalog/category')->getCategoryUrlPath($parentPath,
-                                                                           true, $category->getStoreId());
+        $parentPath = Mage::helper('catalog/category')->getCategoryUrlPath($parentPath, true, $storeId);

-        $requestPath = $parentPath . $urlKey . $categoryUrlSuffix;
-        if (isset($existingRequestPath) && $existingRequestPath == $requestPath . $suffix) {
+        $requestPath = $parentPath . $urlKey;
+        $regexp = '/^' . preg_quote($requestPath, '/') . '(\-[0-9]+)?' . preg_quote($categoryUrlSuffix, '/') . '$/i';
+        if (isset($existingRequestPath) && preg_match($regexp, $existingRequestPath)) {
             return $existingRequestPath;
         }

-        if ($this->_deleteOldTargetPath($requestPath, $idPath, $storeId)) {
+        $fullPath = $requestPath . $categoryUrlSuffix;
+        if ($this->_deleteOldTargetPath($fullPath, $idPath, $storeId)) {
             return $requestPath;
         }

-        return $this->getUnusedPath($category->getStoreId(), $requestPath,
-                                    $this->generatePath('id', null, $category)
+        return $this->getUnusedPathByUrlkey($storeId, $fullPath,
+            $this->generatePath('id', null, $category), $urlKey
         );
     }

@@ -798,7 +816,8 @@ class Mage_Catalog_Model_Url
             $this->_rewrite = $this->_rewrites[$idPath];
             $existingRequestPath = $this->_rewrites[$idPath]->getRequestPath();

-            if ($existingRequestPath == $requestPath . $suffix) {
+            $regexp = '/^' . preg_quote($requestPath, '/') . '(\-[0-9]+)?' . preg_quote($suffix, '/') . '$/i';
+            if (preg_match($regexp, $existingRequestPath)) {
                 return $existingRequestPath;
             }

@@ -836,7 +855,7 @@ class Mage_Catalog_Model_Url
         /**
          * Use unique path generator
          */
-        return $this->getUnusedPath($storeId, $requestPath.$suffix, $idPath);
+        return $this->getUnusedPathByUrlkey($storeId, $requestPath.$suffix, $idPath, $urlKey);
     }

     /**
@@ -891,8 +910,8 @@ class Mage_Catalog_Model_Url
                 $parentPath = Mage::helper('catalog/category')->getCategoryUrlPath($parentPath,
                     true, $category->getStoreId());

-                return $this->getUnusedPath($category->getStoreId(), $parentPath . $urlKey . $categoryUrlSuffix,
-                    $this->generatePath('id', null, $category)
+                return $this->getUnusedPathByUrlkey($category->getStoreId(), $parentPath . $urlKey . $categoryUrlSuffix,
+                    $this->generatePath('id', null, $category), $urlKey
                 );
             }

@@ -913,14 +932,14 @@ class Mage_Catalog_Model_Url
                 $this->_addCategoryUrlPath($category);
                 $categoryUrl = Mage::helper('catalog/category')->getCategoryUrlPath($category->getUrlPath(),
                     false, $category->getStoreId());
-                return $this->getUnusedPath($category->getStoreId(), $categoryUrl . '/' . $urlKey . $productUrlSuffix,
-                    $this->generatePath('id', $product, $category)
+                return $this->getUnusedPathByUrlkey($category->getStoreId(), $categoryUrl . '/' . $urlKey . $productUrlSuffix,
+                    $this->generatePath('id', $product, $category), $urlKey
                 );
             }

             // for product only
-            return $this->getUnusedPath($category->getStoreId(), $urlKey . $productUrlSuffix,
-                $this->generatePath('id', $product)
+            return $this->getUnusedPathByUrlkey($category->getStoreId(), $urlKey . $productUrlSuffix,
+                $this->generatePath('id', $product), $urlKey
             );
         }

如果要将此修补程序与CE一起使用,请确保对其进行正确的测试,因为它是为EE开发的。


您自己是否在CE上测试了此EE补丁?
泰勒五世

@TylerV。不...
Simon

3
我已经在EE 1.9.1.1中尝试了此补丁程序,并且可以使其正常工作。它使用相同的URL密钥解决了产品和类别的问题。希望他们在将来的版本中尽快实现此目标。
Giel Berkers,2015年

1
感谢Simon,一个客户网站上的存储空间从1GB增长到了3MB ...必须每6个月将其截断一次,希望它现在仍然很小:)
willemwigwig

1
我刚刚在1.9 CE上进行了尝试,尽管它适用于产品-类别不太正确。如果我有一个名为'Test'的类别,它给出了URL'... / test',然后我创建了另一个名为'Test'的类别,它应该给出了URL'... / test-2',而只给出了数字名称:“ ... /-2”
奇怪的鸭'16

11

应用Simon张贴的修补程序后,可以使用以下查询删除垃圾数据:

DELETE FROM core_url_rewrite
WHERE is_system <> 1 AND id_path REGEXP "^[0-9]+_[0-9]+$" AND
      (request_path REGEXP ".*-[0-9]*\.html" 
          OR target_path = request_path);

与Ashish Hira的查询相反,这仅影响最后一部分为整数的URL,在我看来,这是造成混乱的原因。

它尝试不接触有效的重写,例如在更新URL密钥时可能已经创建的重写。


6

我已经成功地实现了公认的答案。在另一个Magento安装中,我需要保留一些自定义重写,因此我删除了所有以-结尾的条目,然后删除了一个最长5位数字的数字,并带有:

DELETE FROM `core_url_rewrite` WHERE `request_path` REGEXP '\\-[0-9]{1,5}$';

这通常可以正常工作,但每次重新索引后我仍然可以获得2行。不知道为什么。我以为我会分享这种经验。


1
您可能删除了有效的URL,但以数字结尾。您会发现$collection = Mage::getModel('catalog/product')->getCollection()->addAttributeToFilter('url_key', array('regexp' => '[0-9]$'));
Melvyn 2015年

5

您提到的核心更改仅在您拥有不带url_keys的产品时才需要,但是Magento应该始终为您创建url_keys。如果您有一些进口商在创建没有url_keys的产品,那么这些产品就会出现此问题。尝试运行以下查询以找到此类产品:

SELECT cpe.entity_id, cpe.sku, cpev.value
FROM catalog_product_entity cpe
LEFT JOIN catalog_product_entity_varchar cpev
ON cpe.entity_id = cpev.entity_id AND cpev.attribute_id = (
    SELECT attribute_id
    FROM eav_attribute
    WHERE `entity_type_id` = 4
    AND `attribute_code` = 'url_key'
)
WHERE cpev.value IS NULL OR cpev.value = ''

如果该查询返回了任何产品,则它们没有url_key,这将是一个问题。


2
请注意,entity_type_id产品的默认值是4,而不是
Simon

3

我遵循批准的解决方案来防止重复的URL重写,然后将其导出core_url_rewrite为CSV文件。能够打开此CSV并删除所有但手动创建的URL重写。

然后我将core_url_rewrite表截断,并使用手动创建的URL重写导入保存的CSV。

进行所有更改之后,从940K行增加到32K。巨大的进步。


3

这是Magento社区的补丁程序(本地重写),用于https://github.com/biotech/Magento-URL-Rewrite的修复程序实际上与EE补丁程序PATCH_SUPEE-389_EE_1.12.0.2_v2.sh相同-检查每个重写并避免创建重复的记录。在生产CE 1.9、15k产品,4家商店的情况下,在过去2个月内运行良好,每晚在散装产品进口变化后全面重新编制索引。


测试了多彻底?看起来它只是一小时前发布....
SR_Magento

此问题已在1.9.2.x中修复,因此我们不再需要担心表膨胀吗?
Fiasco Labs 2015年

即使单链接答案可以解决问题,也不是最佳答案。请解释一下您的代码的作用。
马里斯(Marius)

@FiascoLabs是的,可以在所有CE 1.9.x上正常运行
FireBear 2015年

1
@FiascoLabs:1.9.2.x仍然存在此“重写膨胀”问题,并且不包括此修复程序,但是,正如FireBear所说,EE补丁程序可与CE 1.9.2.x一起使用。(尚未亲自尝试;仅想澄清1.9.2.2肯定仍然存在此问题)
Eric Seastrand 2016年

2

由于此线程中尚未提及,因此我想分享一个很酷的消息,即该问题已在Magento 1.9.3.9和更高版本中得到解决。请参阅相关的发行说明

Magento不再对core_url_rewrite表执行不必要的写操作。

因此,当使用Magento大于或等于1.9.3.9的版本时,此处提到的此问题的所有修补程序都是不必要的。我仍然建议删除旧值,如Alex answer中所述


1

运行此查询

DELETE FROM core_url_rewrite WHERE is_system <> 1 AND id_path REGEXP "^[0-9]+_[0-9]+$";

这肯定会core_url_size通过删除垃圾数据来帮助您减小表的大小。


您确定这是垃圾数据吗?我认为它删除后还会重写更改URL密钥时创建的内容!
Alex

检查正则表达式。这意味着没有有效的身份证件
Asish Hira

但是,当在后端手动更改URL密钥时,也会创建这些ID。另请参阅我的答案。
Alex

0

摆脱 .html

  1. 不要使用后缀 .html
  2. 在.htaccess中设置

    ## Redirect all htmls.
    RewriteRule (.+)\.html$ /$1 [L,R=301]
  3. 清除所有.html重定向:

    DELETE FROM core_url_rewrite WHERE request_path LIKE '%.html'

0

官方的答案应该是安装SUPEE-389。就那么简单。

它与Magento CE完美协作,因为他们在该区域共享相同的代码。

您可以在这里找到补丁文件,https://gist.github.com/piotrekkaminski/c348538ca91ba35773be#file-patch_supee-389_ee_1-12-0-2_v2-sh

我们遇到了这个问题,并且在每个目录URL重新索引之后,它都生成了数千个新行。现在问题解决了……除了必须清理数据库的事实。

这里提供的脚本似乎是一个不错的开始,但这并不是一个完美的解决方案,

php shell / rewrites_doctor.php --remove_rewrites 4

参见https://www.atwix.com/magento/duplicated-product-url-keys-in-community-edition/


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.