Vì những người khác đã trả lời cụ thể câu hỏi của bạn. Tôi nghĩ có lẽ tốt hơn để giải thích tại sao việc lập chỉ mục là cần thiết và làm thế nào nó liên quan đến Magento và mối quan hệ với cơ sở dữ liệu hiện đại .
Chỉ mục: một danh sách theo thứ tự chữ cái tên, chủ đề, v.v., với các tham chiếu đến những nơi chúng xảy ra, thường được tìm thấy ở cuối sách.
Vậy chính xác thì Index là gì về Cơ sở dữ liệu ?
Một chỉ mục là một cấu trúc dữ liệu sắp xếp một số bản ghi trên một hoặc nhiều trường và tăng tốc độ truy xuất dữ liệu. Điều này là để tránh quét qua các khối đĩa mà bảng kéo dài, khi tìm kiếm thông qua cơ sở dữ liệu.
Và Indexing là gì về Magento ? Sản phẩm phụ của EAV (Giá trị thuộc tính thực thể) AKA một cơ sở dữ liệu trong cơ sở dữ liệu. Với nhiều bảng tra cứu, tập hợp tất cả các thuộc tính được gắn cờ là được lập chỉ mục để được kết hợp thành một bảng phẳng của tất cả các bảng tra cứu, để truy vấn nhanh hơn và ít I / O hơn và chu kỳ CPU.
Tôi nhớ lại một đề cập rằng khi Magento ban đầu được phát triển, tính linh hoạt cao trong danh sách ưu tiên, đó là điều dễ hiểu tại sao họ chọn đi theo mô hình dữ liệu EAV. Cuối cùng, tuy nhiên, chi phí cho sự linh hoạt như vậy đã phải trả giá bằng hiệu suất và nó đã khiến Magento thất vọng ngay từ đầu.
Nhìn chung, các Kỹ sư Magento được giao nhiệm vụ, trước hết và quan trọng nhất, với việc xây dựng hệ thống linh hoạt nhất, có thể tùy chỉnh nhất có thể và lo lắng về hiệu suất sau này. Tại sao Magento lại chậm như vậy?
EAV là tuyệt vời cho kho dữ liệu nhưng khủng khiếp cho giao dịch. Vậy tại sao chúng ta cần chỉ số để bắt đầu? Vì cách tiếp cận tương tự của mô hình quan hệ đã được thực hiện lại, Magento giờ phải xử lý tất cả những điều mà MySQL tự thực hiện trong nội bộ. Một số điều cần xem xét, chẳng hạn như các Chỉ mục đã tồn tại trong các bảng MySQL. Với ý nghĩ đó, hãy xem xét mô hình dữ liệu EAV ngay bây giờ:
- E ntity = Bảng
- Một ttribution = Field
- V alue = Giá trị
Điều tương tự phải được thực hiện lại, đó là IMO rất "chống mẫu".
Ngoài ra, đây cũng chính là lý do bạn tìm thấy var/locks
bộ chỉ mục sử dụng để khóa quá trình lập chỉ mục. Cơ sở dữ liệu tương tự có khóa hàng / bảng.
Bây giờ khi một bản ghi, giả sử một giá trị sản phẩm đã được thay đổi flat table
hoặcindex
(như những gì MySQL sẽ đề cập đến) phải được cập nhật để được phản ánh cho các truy vấn khi dữ liệu mới được thay đổi được tìm thấy nhanh chóng và hiệu quả mà không cần quét qua nhiều bản ghi. Các bảng phẳng tồn tại như được sử dụng trong cùng một lý do MySQL có chúng, không có chỉ mục như vậy (như một cuốn sách), nó yêu cầu quét toàn bộ bảng để lấy bản ghi. Điều này có nghĩa là số lượng I / O khổng lồ cho cả Đĩa và Bộ nhớ cũng như chu kỳ CPU để xác định vị trí dữ liệu được yêu cầu, điều này rất tệ cho hiệu năng.
Vì Magento sử dụng mô hình dữ liệu EAV, có rất nhiều bảng tra cứu phải được quét để ghép tất cả dữ liệu lại với nhau để xác định vị trí dữ liệu được yêu cầu. Đây là những gì xảy ra nếu bạn vô hiệu hóa danh mục phẳng. Giống như MySQL, quét bản ghi so với sử dụng một chỉ mục (bảng phẳng) để được sử dụng để xác định vị trí bản ghi một cách nhanh chóng trong khi bảo quản các chu kỳ I / O quý giá. Tạo một bảng và không thêm bất kỳ chỉ mục nào cũng giống như không sử dụng các bảng phẳng trong magento. Trong khi hai kịch bản này có thể hoạt động tốt trong các kịch bản khác nhau, See Ben tại Sonassi trả lời rất tốt cho câu hỏi này. (Gợi ý nó liên quan đến việc hiểu phạm vi của dữ liệu.)
Mặc dù đó không phải là câu trả lời trực tiếp cho câu hỏi của bạn, nhưng việc hiểu các bộ phận chuyển động và được chuẩn bị tốt hơn cho chúng sẽ giúp giảm bớt một số vấn đề đau đầu khi lập chỉ mục. " Điều trị vấn đề chứ không phải là triệu chứng. "
Khám phá thêm về phần bên trong của các hệ thống cơ sở dữ liệu hiện đại có thể giúp hiểu rõ hơn về cách thức và lý do Lập chỉ mục là cần thiết và cách nó liên quan (phần nào) với Lập chỉ mục của Magento.
Để tóm tắt: Hiểu phạm vi vấn đề của bạn trước khi áp dụng các giải pháp một cách mù quáng. Vì không phải mọi bit dữ liệu sẽ giống hệt nhau và lập kế hoạch và thực hiện các giải pháp SAU KHI bạn đã hiểu rõ / đầy đủ về vấn đề. Tối ưu hóa cơ sở dữ liệu có thể rất bổ ích cho quản lý thay đổi. Chẳng hạn như ngăn chặn sự sợ hãi DEADLOCKS
.
Bạn cũng có thể muốn xem xét việc thiết lập tất cả các bộ chỉ mục của mình Manual
và thiết lập các quy trình thay thế để xây dựng lại chỉ mục vào giờ thấp điểm (khi quản trị viên đi vắng). Chỉ Product Prices
và Stock Status
nên được đặt thành Update on Save
.
Bây giờ hãy xem xét cách lập chỉ mục hoạt động từ quan điểm kỹ thuật. Các mô-đun chính chịu trách nhiệm lập chỉ mục Mage_Index
. Mô hình cơ bản của indexer: Indexer
, Process
, Event
.
Mage_Index_Model_Indexer
là bộ chỉ mục, tất cả các tương tác với các mô-đun mô-đun khác Mage_Index
xảy ra thông qua dịch vụ này. Nó chứa các phương thức sau:
processEntityAction()
Tạo và đăng ký sự kiện và bắt đầu quá trình lập chỉ mục
logEvent()
Tạo một sự kiện và đăng ký nó để lập chỉ mục tiếp theo;
indexEvent()
Chạy các sự kiện lập chỉ mục;
getProcessesCollection()
Trả về bộ sưu tập của tất cả các quy trình như Thuộc tính sản phẩm, Giá sản phẩm, Phần thưởng Url danh mục, v.v. Thông thường sau khi thay đổi bản chất, như phương thức _afterSave
hoặc _afterCommit
chúng tôi thực hiện chỉ mục lại một phần.
Các Mage_Index_Model_Process
hoặc quá trình là bản chất của indexer của bạn mà các cửa hàng tình trạng, hoạt động chạy cuối cùng. Tất cả các quy trình được lưu trữ trong bảng index_process
. Chương trình có một phương thức getIndexer()
trả về chỉ mục của mô hình. Hầu hết các nhiệm vụ được ủy thác theo quy trình của mô hình chỉ mục.
Mage_Index_Model_Event
lưu trữ thông tin về sự kiện đã xảy ra. Ví dụ: chúng tôi lưu trữ sản phẩm và sau khi lưu, chúng tôi tạo một sự kiện mới và lưu trữ thông tin về loại thực thể chúng tôi vừa lưu, id có tinh thần gì và chúng tôi đã thực hiện hành động nào cho chất này.
Một danh sách chung khi mất hiệu lực xảy ra:
- danh mục / sản phẩm (TIẾT KIỆM, XÓA, MASS_ACTION)
- danh mục / danh mục (TIẾT KIỆM, XÓA)
- danh mục / resource_eav_attribution (TIẾT KIỆM, XÓA)
- khách hàng / nhóm (TIẾT KIỆM)
- cataloginventory / stock_item (TIẾT KIỆM)
- thẻ / thẻ (TIẾT KIỆM)
- lõi / cửa hàng (TIẾT KIỆM, XÓA)
- lõi / store_group (TIẾT KIỆM, XÓA)
- lõi / trang web (TIẾT KIỆM, XÓA)
Bất kỳ mô hình tài nguyên nào có chỉ mục đã đăng ký trong mô-đun config.xml
, khi lưu giao dịch. afterCommitCallback()
được gọi với một tiền tố. Đây là nơi các sự kiện chỉ mục được ghi lại, vì nó ở cuối một giao dịch thành công.
... Và điều khiến tôi buồn là EAV vẫn xuất hiện trong Magento 2. :(
Tài liệu tham khảo: