Keyword

Liên hệ

[WC] Update 7.6.1 Điểm chuẩn hiệu suất cho WooCommerce HPOS

Kể từ năm ngoái, WooCommerce đã làm việc để xây dựng và triển khai HPOS (Lưu trữ đơn hàng hiệu suất cao) dưới dạng một tính năng chọn tham gia. Điều này thay đổi cách chúng tôi lưu trữ dữ liệu đơn đặt hàng trong cơ sở dữ liệu, từ các loại bài đăng tùy chỉnh trong wp_postvà wp_postmetabảng thành các bảng tùy chỉnh được dành riêng để lưu trữ dữ liệu đơn đặt hàng. Chúng tôi cũng đã xuất bản cấu trúc chi tiết cho các bảng này: Lưu trữ đơn hàng hiệu suất cao: Lược đồ cơ sở dữ liệu

Bạn có thể đọc về động lực cho sự thay đổi này trong Kế hoạch cho Bảng đơn hàng tùy chỉnh WooC Commerce .

Giờ đây, những cải tiến hiệu suất mà HPOS sẽ mang lại, bằng cách chia sẻ kết quả kiểm tra hiệu suất mà chúng tôi đã và đang thực hiện. Hiệu suất của lưu trữ dựa trên bài đăng với HPOS đối với các chức năng và truy vấn phổ biến như tạo đơn hàng, lọc, v.v.

1. Các table mới.

Có 4 bảng chúng tôi đã thêm trong dự án này:

  1. Bảng đặt hàng chính – wc_orders
  2. Bảng địa chỉ đặt hàng – wc_order_addresses
  3. Bảng thao tác đặt hàng  – wc_order_operational_data
  4. Bảng đặt hàng Meta – wc_orders_meta

2. Tạo đơn hàng

Tạo đơn hàng được xác định là một trong những mục tiêu chính của dự án, bằng cách giảm số lượng truy vấn chèn mà chúng tôi sẽ phải thực hiện để tạo đơn hàng. Ở đây, chúng tôi thấy  hiệu suất chèn theo thứ tự được cải thiện gấp 5 lần , chủ yếu là do chúng tôi hiện cần chạy ít truy vấn chèn hơn do nhiều trường meta được làm phẳng trong các bảng tùy chỉnh.

VD: Tạo thử 1000 đơn hàng

function benchmark_hpos_create_usage() {
        global $wpdb;
        $product_id = 502197;
        $count = 1000;
 
        $product = wc_get_product( $product_id );
        $label = \Automattic\WooCommerce\Utilities\OrderUtil::custom_orders_table_usage_is_enabled() ? 'HPOS' : 'Posts table';
        $time = microtime( true );
        for ( $i = 0; $i < $count; $i++ ) {
                $order = new WC_Order();
                $order->set_billing_first_name( 'John' );
                $order->set_billing_address_2( '123' );
                $order->add_product( $product );
                $order->save();
                assert( $order->get_id() > 0 );
        }
        $time_taken = microtime( true ) - $time;
        echo "[$label] " . 'Time to create ' . $count . ' orders: ' . $time_taken . 's';
}

Kết quả:

[HPOS] Thời gian tạo 1000 lệnh: 15.181570053101s
[Bảng bài viết] Thời gian tạo 1000 đơn hàng: 78.124469995499s

3. Thanh toán đơn hàng

Tương tự như trên, chúng tôi cũng kỳ vọng hiệu suất thanh toán sẽ tăng lên. Lưu ý rằng hiệu suất chèn không trực tiếp chuyển thành hiệu suất thanh toán, vì hiệu suất sau liên quan đến nhiều trình kích hoạt và xác minh dữ liệu khác nhau (chẳng hạn như quản lý khoảng không quảng cáo, nhiều móc do_action và apply_filter khác nhau, xác minh người dùng, v.v.).

Mặc dù vậy, chúng tôi nhận thấy sự cải thiện khoảng 1,5 lần khi thanh toán  (đối với thanh toán đơn giản với một sản phẩm) khi sử dụng HPOS:

function hpos_benchmark_process_checkout() {
    $label = \Automattic\WooCommerce\Utilities\OrderUtil::custom_orders_table_usage_is_enabled() ? 'HPOS' : 'Posts table';
    wc_load_cart();
    $product = wc_get_product( 502197 );
  
    add_filter( 'woocommerce_payment_successful_result', function ( $result, $order_id ) {
        assert( $order_id > 0 );
        throw new Exception( 'Order created: ' . $order_id );
    }, 10, 3 );
  
    $_POST['terms'] = 1;
    $_POST['terms-field'] = 1;
    $_POST['createaccount'] = 1;
    $_POST['payment_method'] = 'cod';
    $_POST['billing_first_name'] = 'John';
    $_POST['billing_last_name'] = 'Doe';
    $_POST['billing_company'] = 'Company';
    $_POST['billing_address_1'] = '123 Main St';
    $_POST['billing_address_2'] = '';
    $_POST['billing_city'] = 'San Francisco';
    $_POST['billing_state'] = 'CA';
    $_POST['billing_postcode'] = '94107';
    $_POST['billing_country'] = 'US';
    $_POST['billing_email'] = 'test_' . time() . '@example.com';
    $_POST['billing_phone'] = '555-555-5555';
    $_POST['ship_to_different_address'] = 0;
  
    add_action( 'woocommerce_after_checkout_validation', function ( $data, $errors ) {
        if ( $errors->get_error_messages() ) {
            print_r( implode( $errors->get_error_messages() ) );
            throw new Exception( 'Validation failed: ' . implode( ', ', $errors->get_error_messages() ) );
        }
    }, 10, 2 );
  
    $time_taken = 0;
    for ( $i = 0; $i < 10; $i++ ) {
        wc_empty_cart( true );
        $checkout_nonce = wp_create_nonce( 'woocommerce-process_checkout' );
        $_REQUEST['woocommerce-process-checkout-nonce'] = $checkout_nonce;
        wc_clear_notices();
        WC()->cart->add_to_cart( $product->get_id(), 1 );
        benchmark_checkout( $time_taken );
    }
    wc_maybe_define_constant( 'DOING_AJAX', false );
    echo "[$label] " . 'Time to process 10 checkouts: ' . $time_taken . 's';
  
}
  
function benchmark_checkout( &$time_taken ) {
    $time = microtime( true );
    try {
        WC()->checkout()->process_checkout();
    } catch ( Exception $e ) {
        echo $e->getMessage();
    }
    $time_taken = $time_taken + ( microtime( true ) - $time );
}

Kết quả

[HPOS] Thời gian xử lý 10 lần kiểm tra: 0,99165391921997s

[Bảng bài viết] Thời gian xử lý 10 lần kiểm tra: 1.5086543560028s

4. Tìm kiếm đơn đặt hàng bằng siêu dữ liệu

Trong dự án HPOS, chúng tôi cũng có quyền tự do triển khai các chỉ mục trên order_metabảng, điều mà chúng tôi không có đối với bảng bài đăng. Như bạn mong đợi,  việc thêm các chỉ mục sẽ tăng tốc độ tra cứu truy vấn meta, khoảng 10 lần trong mã đo điểm chuẩn bên dưới . Mặt khác, các chỉ mục bổ sung làm giảm tốc độ chèn, nhưng điều đó sẽ được bù đắp bằng hiệu suất tăng của chèn từ làm phẳng, như đã lưu ý trong các thử nghiệm trước.

function benchmark_hpos_metadata() {
    $label = \Automattic\WooCommerce\Utilities\OrderUtil::custom_orders_table_usage_is_enabled() ? 'HPOS' : 'Posts table';
  
    $time = microtime( true );
  
    $query = new WC_Order_Query(
        array(
            'limit'      => 1000,
            'return'     => 'ids',
            'orderby'    => 'id',
            'order'      => 'DESC',
            'billing_address_index' => 'John    123      ',
            'meta_query' => array(
                array(
                    'key'     => '_billing_address_index',
                    'value'   => 'John    123      ',
                    'compare' => '=',
                ),
            ),
        )
    );
  
    $orders     = $query->get_orders();
    $time_taken = microtime( true ) - $time;
    assert( count( $orders ) === 1000 );
    echo "[$label] " . 'Time to search ' . count( $orders ) . ' orders by metadata: ' . $time_taken . 's';
}

Kết quả

[HPOS] Thời gian tìm kiếm 1000 đơn hàng theo siêu dữ liệu: 0,052868127822876s

[Bảng bài viết] Thời gian tìm kiếm 1000 đơn hàng theo siêu dữ liệu: 0,63891506195068s

WC_Order_Query là một lớp trong WooCommerce để truy vấn các đơn hàng. Đây là tất cả các tham số có thể được sử dụng khi truy vấn các đơn hàng bằng cách sử dụng WC_Order_Query():

  • limit (số lượng đơn hàng tối đa để trả về)
  • status (trạng thái của đơn hàng, ví dụ: ‘pending’, ‘processing’, ‘completed’,…)
  • customer_id (ID của khách hàng)
  • date_created (ngày tạo đơn hàng)
  • date_modified (ngày sửa đổi đơn hàng)
  • date_paid (ngày thanh toán đơn hàng)
  • date_completed (ngày hoàn thành đơn hàng)
  • payment_method (phương thức thanh toán)
  • meta_key (khóa meta để truy vấn)
  • meta_value (giá trị meta để truy vấn)
  • billing_country (quốc gia của địa chỉ thanh toán)
  • shipping_country (quốc gia của địa chỉ giao hàng)
  • orderby (sắp xếp kết quả theo thuộc tính nào, ví dụ: ‘date’, ‘ID’, ‘title’,…)
  • order (thứ tự sắp xếp, ví dụ: ‘ASC’ hoặc ‘DESC’)
  • return (loại dữ liệu trả về, ví dụ: ‘ids’, ‘objects’ hoặc ‘count’)

5. Tìm kiếm đơn đặt hàng bằng cột không được lập chỉ mục

Tương tự như trên, một số cột không được lập chỉ mục

function benchmark_hpos_search_non_index_usage() {
    $label = \Automattic\WooCommerce\Utilities\OrderUtil::custom_orders_table_usage_is_enabled() ? 'HPOS' : 'Posts table';
  
    $time = microtime( true );
    if ( 'HPOS' === $label ) {
        $query = new WC_Order_Query(
            array(
                'limit'       => 1000,
                'return'      => 'ids',
                'orderby'     => 'id',
                'order'       => 'DESC',
                'field_query' => array(
                    array(
                        'field' => 'created_via',
                        'value' => 'checkout',
                    )
                )
            )
        );
    } else {
        $query = new WC_Order_Query(
            array(
                'limit'       => 1000,
                'return'      => 'ids',
                'orderby'     => 'id',
                'order'       => 'DESC',
                'created_via' => 'checkout'
  
            )
        );
    }
    $orders = $query->get_orders();
    assert( count( $orders ) === 1000 );
    $time_taken = microtime( true ) - $time;
    echo "[$label] " . 'Time to search orders: ' . $time_taken . 's' . PHP_EOL;
}

6. Kêt luận

Với HPOS, về mặt kỹ thuật, chúng tôi đang phân tách bảng sau meta bằng cách loại bỏ tất cả các mục liên quan đến đơn đặt hàng. Chúng tôi hy vọng rằng cuối cùng, quản trị viên trang web sẽ có thể xóa các hàng meta bài đăng hiện có thuộc về đơn đặt hàng, do đó tăng hiệu suất trang web bên ngoài quy trình làm việc của đơn đặt hàng (vì kích thước bảng nhỏ hơn có nghĩa là MySQL sẽ quét ít hàng hơn trong khi truy vấn).

Chẳng hạn, trong woocommerce.com, một triển khai lớn, các đơn đặt hàng chiếm khoảng 81% trong tất cả các bản ghi bài đăng. Trong  wp_postmeta bảng, độ lệch này thậm chí còn lớn hơn, các bản ghi meta thuộc về đơn đặt hàng chiếm khoảng 97% tổng số hàng. Nếu chúng tôi xóa các bản ghi meta bài đăng thuộc về các đơn đặt hàng (mà chúng tôi dự định thực hiện sau khi HPOS đã chạy được một thời gian), thì  woocommerce.com sẽ thấy dữ liệu bảng  meta  bài đăng giảm 97% . Chúng tôi hy vọng việc giảm kích thước này sẽ cải thiện hiệu suất tổng thể của trang web và không bị giới hạn đối với các đơn đặt hàng.


Disclaimer: Bài viết của chỉ nhằm mục đích cung cấp thông tin, kiến thức và bài viết này.

Follow us:
  • Facebook:
  • Website:
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Phản hồi nội tuyến
Xem tất cả bình luận

Bài viết được đọc nhiều