마 젠토에서 인덱싱 작동 방식


30
  1. 마 젠토에서 인덱싱 작동 방식
  2. 정확히 무엇입니까?
  3. 왜 필요한가요?

이 링크 : stackoverflow.com/questions/4945307/… 도움이 될 것입니다
TBI Infotech

다음은 Magento 2의 프로세스 및 작업 magento.stackexchange.com/questions/90510/…
Yogesh Trivedi

어떤 버전의 Magento를 사용하고 있습니까? v1.13에서는 많은 부분이 변경되었으므로 해당 버전 이전의 버전에 차이가있을 것으로 예상됩니다. 다음은 Magento 버전 1.13의 mView 모듈 및 색인 작성에 대한 멋진 블로그 게시물입니다. eschrade.com/page/…
Pitt

답변:


64

마 젠토에는 여러 종류의 색인이 있습니다.
모든 인덱서는 작업 속도를 높이기 위해 존재합니다.
여기서는 몇 가지만 다루겠습니다.

플랫 인덱스
이러한 인덱스는 2 가지가 있습니다. 하나는 범주와 하나는 제품입니다.
기본적으로 범주 및 제품 엔터티 (및 고객 및 고객 주소는이 상황에서 중요하지 않음)는 EAV 엔터티입니다. 이것은 확장성에 매우 좋습니다. 그러나 모든 속성에 대한 모든 값을 얻으려면 많은 조인이나 여러 쿼리가 필요하기 때문에 성능이 저하됩니다.
플랫 인덱서가 등장하는 곳입니다.
. EAV 구조를 플랫 구조로 변환합니다. 속성에 해당하는 하나의 열이있는 테이블 (마젠 토의 각 상점보기마다 하나씩)을 작성한다는 의미입니다. 이렇게하면 선택 속도가 빨라집니다. 범주의 경우 모든 특성이 테이블 열로 변환됩니다. 제품의 경우 속성이 다른 모든 유형의 제품을 판매 할 수 있고 가질 리언 열이있는 하나의 테이블을 만들 수 없기 때문에 '제품 목록에 사용됨'으로 표시 한 제품 만 가능하지 않을 수 있습니다.
또한 일부 제품이 비활성화되었거나 특정 웹 사이트에 속하지 않을 수 있으며 검색 할 항목에 해당 제품을 포함시킬 필요가 없습니다. 인덱서에서 제외됩니다.
생성 된 플랫 테이블은 프론트 엔드에서 데이터를 읽는 데 사용됩니다. 백엔드는 여전히 EAV 구조를 사용합니다.

카탈로그 검색 색인
많은 속성 값으로 제품을 검색 할 수 있습니다. 플랫 인덱서에서 생성 된 플랫 테이블에는 일부가 포함되지 않을 수 있습니다. 이 색인은 제품의 검색 가능한 속성 값으로 테이블을 채우므로 키워드를 기반으로 쉽게 찾을 수 있습니다. 하나의 테이블 (또는 하나의 필드)에 모든 정보가 있으면 전체 텍스트 검색을 사용하고 관련 결과를 얻을 수 있습니다.

제품 가격 .
제품 가격은 많은 변수의 영향을받을 수 있습니다. 예를 들어, 고객 그룹, 웹 사이트, 카탈로그 할인 규칙.
위와 동일하게 가격이 책정 된 제품을 얻는 것은 많은 조인 또는 여러 선택을 의미합니다. 또한 번들 제품에는 이상한 가격 시스템이 있습니다. 이 인덱서는 일부 테이블 ( catalog_product_index_price_*) 의 데이터를 집계하고 선택 (정렬 및 필터링)을 훨씬 쉽게 만듭니다.

카탈로그 URL 다시 쓰기
이것은 어떤 URL이 어떤 제품 또는 카테고리에 해당하는지 설정하여 URL 다시 쓰기 규칙을 정리합니다. URL 관리 내부 시스템이 비표준 URL을 호출 할 때 볼 페이지를 결정하는 것이 더 쉬운 방법입니다. 모든 제품 및 카테고리 URL 키를 검색하는 대신 하나의 테이블에서 검색합니다.

카테고리 제품
Magento에서 'Is Anchor'라는 카테고리 속성을 true 또는 false로 설정할 수 있습니다. 사실 인 경우 해당 카테고리에 하위 카테고리의 모든 제품이 나열됨을 의미합니다. 다시이 실시간을 결정하면 하나의 테이블을 읽는 것보다 더 많은 리소스가 필요합니다. 이 인덱서는 백엔드에서 설정 한 연관 및 카테고리의 'Is Anchor'플래그를 기반으로 제품과 카테고리 간의 연관을 작성합니다.

재고 상태
간단한 제품의 경우 쉽습니다. 재고가 있거나 재고가 없을 수 있지만 구성 가능한 그룹화 및 번들은 쉽지 않습니다. 주 제품과 관련된 하위 제품에 따라 재고가 있거나 재고가 없을 수 있습니다. 다시 말하지만 (여기서 스스로 반복하고 있습니다) 실시간으로 상태를 얻는 것은 많은 쿼리를 의미합니다.

제품 속성 .
이것은 동일한 이유로 계층 탐색에 사용될 수있는 모든 속성을 수집합니다. 더 빨리 읽을 수 있도록 한 곳에 보관하십시오.

태그 집계이 기능
이 무엇인지 잘 모르겠습니다. 실제 라이브 프로젝트에서 태그를 사용한 적이 없습니다.


고마워 마리우스 이것은 가장 좋은 답변입니다 ... 내가 가진
소남

플랫 테이블이 프론트 엔드에서만 사용되고 백엔드는 여전히 EAV 구조를 사용한다고 말했을 때의 의미는 무엇입니까? 나는 초보자이며 제품과 같은 엔터티를 만들거나 업데이트 할 때 여전히 EAV 테이블을 사용하여 이러한 작업을 수행하며 플랫 테이블을 저장하거나 수동으로 업데이트 할 때 옵션을 설정합니다. 이러한 변경 사항은 플랫 테이블에 반영됩니다. 당신이 그렇게 말할 때이 과정을 언급하고 있습니까? 이것에 대해 자세히 설명해 주시겠습니까? 감사!
Bharadwaj Srigiriraju

1
@Marius : 다시 인덱싱하는 동안 테이블이 가득 찼습니다. 도와주세요. 입니다 나는 점점 오전 오류 표 'catalog_product_index_price_bundle_sel_tmp 것은'가득
블랙 비어드 데이빗

1
@Marius이 답변의 3 년 후 이제 Tag Aggregation에 대한 아이디어가 있습니까? 제품 태그와 관련이 있습니까 ??
Murtuza Zabuawala

1
@검은. 인덱스에는 2 가지 설정이 있습니다. "저장시 업데이트"및 "수동". 저장시 업데이트하려면 제품을 저장할 때 모든 것이 자동으로 수행되어야합니다. 그러나 이로 인해 성능 문제가 발생할 수 있습니다. 예를 들어 한 번에 여러 제품을 변경하는 경우 수동 모드의 경우 저장 후 즉시 재 인덱싱이 트리거되지 않지만 완료되면 수동으로 다시 작성해야합니다.
Marius

11

https://stackoverflow.com/questions/4945307/can-someone-explain-magentos-indexing-feature-in-detail의 원래 게시물에서 가져 왔으므로 이에 대한 크레딧을받을 수 없습니다

Magento의 인덱싱은 데이터베이스 수준 인덱싱과 비슷합니다. Anton이 말했듯이 사이트를보다 빠르게 운영 할 수 있도록 비정규 화 프로세스입니다. Magento 데이터베이스 구조에 대한 몇 가지 생각과 왜 빠른 속도로 작동하기 위해 색인 생성이 필요한지 설명하겠습니다.

좀 더 "일반적인"MySQL 데이터베이스에서 카탈로그 제품을 저장하기위한 테이블은 다음과 같이 구성됩니다.

PRODUCT:
    product_id INT
    sku        VARCHAR
    name       VARCHAR
    size       VARCHAR
    longdesc   VARCHAR
    shortdesc  VARCHAR
    ... etc ...

검색 속도는 빠르지 만 전자 상거래 소프트웨어에는 근본적인 문제가 남아 있습니다. 속성을 더 추가하려면 어떻게해야합니까? 장난감을 판매하고 크기 열이 아닌 경우 age_range가 필요합니까? 글쎄, 다른 열을 추가 할 수는 있지만 큰 매장 (예 : Walmart)에서는 행이 90 % 비어 있고 새로운 속성을 유지하려고 시도하는 것이 거의 불가능하다는 것이 분명해야합니다.

이 문제를 해결하기 위해 Magento는 테이블을 더 작은 단위로 분할합니다. 이 답변에서 전체 EAV 시스템을 다시 만들고 싶지 않으므로이 단순화 된 모델을 수락하십시오.

PRODUCT:
    product_id INT
    sku        VARCHAR

PRODUCT_ATTRIBUTE_VALUES
    product_id   INT
    attribute_id INT
    value        MISC

PRODUCT_ATTRIBUTES
    attribute_id
    name

이제 product_attributes에 새 값을 입력 한 다음 인접한 레코드를 product_attribute_values에 넣어서 원하는대로 속성을 추가 할 수 있습니다. 이것은 기본적으로 Magento 가하는 것입니다 (여기에 표시된 것보다 데이터 유형에 약간의 관심이 있습니다). 실제로 두 제품이 동일한 필드를 가질 이유가 없으므로 속성 세트가 다른 전체 제품 유형을 만들 수 있습니다!

그러나이 유연성은 비용이 많이 듭니다. 내 시스템에서 셔츠의 색을 찾으려면 (사소한 예) 다음을 찾아야합니다.

  1. 상품의 product_id (제품 표에 있음)
  2. 색상의 attribute_id (속성 테이블에서)
  3. 마지막으로 실제 값 (attribute_values ​​테이블)

마 젠토는 이런 식으로 작동했지만 느리게 죽었습니다. 따라서 더 나은 성능을 위해 타협점을 찾았습니다. 상점 소유자가 원하는 속성을 정의한 후에는 처음부터 큰 테이블을 생성하십시오. 무언가가 바뀌면 우주에서 핵무기를 만들어 다시 생성합니다. 이렇게하면 데이터가 기본적으로 유연한 형식으로 저장되지만 단일 테이블에서 쿼리됩니다.

이러한 결과 조회 테이블은 마 젠토 "인덱스"입니다. 색인을 다시 생성하면 이전 테이블이 불고 다시 생성됩니다.

그것이 약간의 내용을 명확히하기를 바랍니다!


nuke it from space, nice :)
Wietse 2013

5

마 젠토는 매우 강력하고 복잡한 시스템입니다. 방대한 양의 데이터로 작업 할 수 있지만 데이터베이스에 많은 레코드가 오버로드되면 무겁고 느려집니다. Magento는 색인을 사용하여이 문제를 해결합니다. 인덱스는 데이터가 평평한 추가 데이터베이스 테이블로, 데이터베이스에서 빠른 응답을 구성 할 수 있습니다.

기본적으로 핵심 시스템은 각 항목 저장시 인덱스를 업데이트합니다. 그러나 일부 유형의 대량 작업 등과 같이 일부 경우 수동으로 수행해야합니다. 관리자 백엔드 (관리자-> 시스템-> 인덱스 관리)에서 언제든지 인덱스를 업데이트 할 수 있습니다. 그러나 때때로 문제가 발생합니다.

예를 들어 10k + 이상의 제품과 많은 카테고리가있는 경우 '카탈로그 URL 다시 쓰기'색인을 다시 작성하는 데 몇 시간이 걸릴 수 있습니다. 그런 다음 max_execution_time 초과로 인해 PHP 스크립트가 중단 될 수 있습니다. 명령 행에서 재색 인 프로세스를 실행하여 여러 문제점을 해결하는 방법이 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.