Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Ai đó có thể giải thích chi tiết về tính năng Lập chỉ mục của Magentos không?

Về mặt tinh thần, việc lập chỉ mục của Magento chỉ tương tự như lập chỉ mục cấp cơ sở dữ liệu. Như Anton nói, đó là một quá trình không chuẩn hóa để cho phép một trang web hoạt động nhanh hơn. Hãy để tôi cố gắng giải thích một số suy nghĩ đằng sau cấu trúc cơ sở dữ liệu Magento và lý do tại sao cấu trúc này làm cho việc lập chỉ mục cần thiết để hoạt động ở tốc độ cao.

Trong cơ sở dữ liệu MySQL "điển hình" hơn, một bảng để lưu trữ các sản phẩm danh mục sẽ có cấu trúc như sau:

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

Điều này nhanh chóng để truy xuất, nhưng nó để lại một vấn đề cơ bản đối với một phần mềm Thương mại điện tử:bạn phải làm gì khi muốn thêm nhiều thuộc tính hơn? Điều gì xảy ra nếu bạn bán đồ chơi và thay vì cột kích thước, bạn cần age_range ? Chà, bạn có thể thêm một cột khác, nhưng cần rõ ràng rằng trong một cửa hàng lớn (ví dụ như Walmart), điều này sẽ dẫn đến các hàng trống 90% và việc cố gắng duy trì các thuộc tính mới là không thể.

Để giải quyết vấn đề này, Magento chia các bảng thành các đơn vị nhỏ hơn. Tôi không muốn tạo lại toàn bộ hệ thống EAV trong câu trả lời này, vì vậy vui lòng chấp nhận mô hình đơn giản này:

PRODUCT:
    product_id INT
    sku        VARCHAR

PRODUCT_ATTRIBUTE_VALUES
    product_id   INT
    attribute_id INT
    value        MISC

PRODUCT_ATTRIBUTES
    attribute_id
    name

Giờ đây, bạn có thể thêm các thuộc tính theo ý muốn bằng cách nhập các giá trị mới vào product_attributes và sau đó đặt các bản ghi liền kề vào product_attribute_values . Về cơ bản đây là những gì Magento làm (tôn trọng hơn một chút đối với các kiểu dữ liệu so với những gì tôi đã hiển thị ở đây). Trên thực tế, không có lý do gì để hai sản phẩm có các trường giống hệt nhau, vì vậy chúng tôi có thể tạo toàn bộ loại sản phẩm với các bộ thuộc tính khác nhau!

Tuy nhiên, sự linh hoạt này phải trả giá đắt. Nếu tôi muốn tìm color của một chiếc áo sơ mi trong hệ thống của tôi (một ví dụ nhỏ), tôi cần tìm:

  1. product_id của mặt hàng (trong bảng sản phẩm)
  2. attribute_id cho color (trong bảng thuộc tính)
  3. Cuối cùng, giá trị value thực tế (trong bảng giá trị_ thuộc tính)

Magento đã từng làm việc như vậy, nhưng nó rất chậm. Vì vậy, để cho phép hiệu suất tốt hơn, họ đã thỏa hiệp:một khi chủ cửa hàng đã xác định các thuộc tính họ muốn, hãy tiếp tục và tạo bảng lớn ngay từ đầu. Khi một thứ gì đó thay đổi, hãy lấy nó khỏi không gian và tạo lại. Bằng cách đó, dữ liệu được lưu trữ chủ yếu ở định dạng linh hoạt đẹp mắt của chúng tôi, nhưng được truy vấn từ một bảng duy nhất.

Các bảng tra cứu kết quả này là "chỉ mục" của Magento. Khi bạn lập chỉ mục lại, bạn đang làm nổ bảng cũ và tạo lại nó.

Hy vọng điều đó làm sáng tỏ mọi thứ một chút!

Cảm ơn, Joe



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Laravel 4:nhiều nơi có hoặc hùng hồn

  2. SQL chỉ chọn các hàng có giá trị tối đa trên một cột

  3. Máy chủ xxxx không được phép kết nối với máy chủ MySQL này

  4. Hướng dẫn SQL về khóa chính - Cách xác định khóa chính trong cơ sở dữ liệu

  5. MySQL MOD () Hàm - Thực hiện một hoạt động Modulo trong MySQL