WooCommerce电商开发:高性能订单存储HPOS性能基准测试

news2024/9/21 4:40:27

自去年以来,我们一直致力于构建和推出 HPOS(高性能订单存储)作为一项可选功能。这改变了我们在数据库中存储订单数据的方式,从自定义帖子类型 wp_postwp_postmeta表到专门用于存储订单数据的自定义表。我们还发布了这些表的详细结构:高性能订单存储:数据库模式

您可以在WooCommerce 自定义订单表的计划中了解此更改的动机。

现在,我们很高兴通过分享我们一直在做的高性能订单存储HPOS性能基准测试的结果,与大家分享HPOS将带来的性能提升。我们将比较基于帖子的存储与 HPOS 在常见功能和查询(例如订单创建、过滤等)方面的性能。

目录  隐藏 

设置和方法

测试订单创建

基准代码

结果

订单结账

基准代码

结果

使用元数据搜索订单

基准代码

结果

按索引列过滤

基准代码

结果

使用非索引列搜索订单

基准代码

结果

数据库大小

结论

下一步

设置和方法

我们将在我们的测试站点上运行这些测试,该测试站点已经有大约 40 万个订单和 3 万个产品。该网站运行在一个商业计划中,每月收费 25 美元。该站点memcached启用并安装了缓存(主机标准产品的一部分),但该站点上没有其他特定的性能插件处于活动状态。

我们将在 WP shell 中运行查询,这意味着我们不会利用主机提供的并行性。换句话说,我们将只使用一个 worker,这相当于在一个请求中完成所有工作,而主机实际上并行提供了更多的 worker,即主机可以并行处理许多 Web 请求。这就是说,网站的整体性能比我们的基准测试在这里建议的要高得多。

我们还禁用了 HPOS <> 后同步,因为启用它会破坏基准测试的目的,尤其是对于订单创建流程。您可以在高性能订单存储:向后兼容性和同步中阅读有关同步如何工作的更多信息。我们预计最终商店将在其网站上永久禁用同步。

此外, WP 6.1 中引入的WP query cache 性能提升也被禁用,因此我们的查询实际上会访问数据库。

该站点上的表大小wp_postmeta约为 2GB(140 万行),表大小wp_posts约为 240MB(60 万行)。

请注意,使用的 WooCommerce 版本是开发版本,构建在cot-main分支上。这有稳定性修复,目前在主干中不可用,但应该很快可用(这些补丁正在审查周期中)。

测试

我们将使用一些直接查询进行测试,因为它们可以最直接地触发被测系统,而不会受到请求其他部分的干扰。

订单创建

通过减少我们为创建订单而必须执行的插入查询的数量,创建订单被确定为该项目的主要目标之一。在这里,我们看到 顺序插入性能提高了大约 5 倍,这主要是因为我们现在需要运行更少的插入查询,因为多个元字段在自定义表中被展平了。

基准代码

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';
}

结果

[HPOS] 创建1000个订单的时间:15.181570053101s[帖子表]创建1000个订单的时间:78.124469995499s

订单结账

与上述类似,我们也期望结账性能有所提高。请注意,插入性能不会直接转化为结帐性能,因为后者涉及各种数据验证和触发器(例如库存管理、各种 do_action 和 apply_filter 挂钩、用户验证等)。

即便如此,在使用 HPOS 时,我们看到结账 (对于一种产品的简单结账)提高了约 1.5 倍:

基准代码

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 );
}

结果

[HPOS] 处理 10 次结帐的时间:0.99165391921997s[帖子表] 处理 10 次结帐的时间:1.5086543560028s

使用元数据搜索订单

在 HPOS 项目中,我们还可以自由地在order_meta表上实现索引,这是我们在 post 表上没有的。如您所料, 添加索引可加快元查询查找速度,在以下基准测试代码中约为 10 倍。另一方面,额外的索引会降低插入速度,但这应该被扁平化带来的插入性能提升所抵消,如之前的测试所述。

基准代码

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';
}

结果

[HPOS] 按元数据搜索 1000 个订单的时间:0.052868127822876s[帖子表]按元数据搜索1000个订单的时间:0.63891506195068s

按索引列过滤

现在我们已经将几个 post_meta 键扁平化到它们自己的列中,我们还在相关的地方利用各个 meta_keys 上的索引。其中一个字段 customer_id 有自己的索引列,而在 post 表中,它存储在 _customer_user 元键中。 在 HPOS 中,这个获取客户所有订单的查询现在快 40 倍, 因为它可以使用列的索引 customer_id 。

基准代码

function benchmark_hpos_filter_customer() {
    $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',
            'customer_id' => 56902779,
        )
    );
    $orders = $query->get_orders();
  
    $time_taken = microtime( true ) - $time;
    echo "[$label] " . 'Time to filter ' . count( $orders ) . ' orders for customer: ' . $time_taken . 's' . PHP_EOL;
}

结果

[HPOS] 为客户筛选 1000 个订单的时间:0.015961170196533s[帖子表]为客户过滤1000个订单的时间:0.59882402420044s

使用非索引列搜索订单

与上面类似,一些扁平化的列没有被索引。但是,我们仍然期望性能有所提高,因为搜索区域仍然从wp_postmeta之前的整个表格减少到每个订单只有一个条目。在下面的查询中, 这 为我们的数据库带来了高达 3 倍的改进。

基准代码

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;
}

结果

[HPOS] 查询订单时间:0.29565596580505s[帖子表]搜索订单的时间:1.0048348903656s

数据库大小

借助 HPOS,我们通过移出与订单相关的所有条目在技术上对post-meta表进行分片。我们希望站点管理员最终能够删除属于订单的现有post-meta行,从而提高订单工作流之外的站点性能(因为较小的表大小意味着 MySQL 在查询期间扫描的行数较少)。

例如,在大型部署的 woocommerce.com 中,订单约占所有帖子记录的 81%。在 wp_postmeta 表中,这种偏差更大,属于订单的元记录约占所有行的 97%。如果我们要删除属于订单的帖子元记录(我们计划在 HPOS 运行一段时间后执行此操作),  woocommerce.com 将看到 post-meta表数据减少 97%。我们希望这种尺寸减小能够提高网站的整体性能,而不仅限于订单。

结论

如您所见,HPOS 提高了各种与订单相关的流程的性能,并有可能大大提高一般站点的性能。我们鼓励所有插件开发人员升级他们的插件以支持 HPOS,以便生态系统中的商家可以利用这个项目。

下一步

与查询基准类似,我们也在运行网络请求性能测试,并计划很快发布结果。

点击阅读 WooCommerce电商开发:高性能订单存储HPOS性能基准测试 原文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/512175.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

六、Spring Cloud Alibaba-nacos配置中心

一、Nacos配置中心 前面说了三、Spring Cloud Alibaba组件nacos&#xff0c;主要介绍的是服务发现。该篇主要介绍配置中心的功能。 官方地址&#xff1a; https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config。 Nacos 提供用于存储配置和其他元数据的 key/val…

tomcat集群下的session共享和负载均衡(memcache实现)

环境 操作系统&#xff1a;windows tomcat1&#xff1a;Apache Tomcat/7.0.52&#xff08;8085&#xff09; tomcat2&#xff1a;Apache Tomcat/7.0.52&#xff08;8086&#xff09; jdk&#xff1a;1.8.0_251 nginx&#xff1a;nginx-1.20.1&#xff08;8070&#xff09; memc…

美颜SDK的算法分析:探究其背后的机器学习模型

美颜SDK作为常见的美颜工具&#xff0c;其使用的算法也备受关注。本文将从机器学习的角度&#xff0c;深入分析美颜SDK的算法模型与实现原理。 一、算法模型 美颜SDK主要采用的算法模型是卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;。…

网卡名称排序

udev是一种动态设备管理系统&#xff0c;用于在Linux系统中自动管理设备的插拔、识别、配置等操作。它的主要作用是监视系统中的设备事件&#xff0c;并根据设备事件动态地创建、删除或修改系统中的设备节点。 udev的工作原理是通过读取系统中的硬件信息、驱动程序和设备特征信…

AI天后,在线飙歌,人工智能AI孙燕姿模型应用实践,复刻《遥远的歌》,原唱晴子(Python3.10)

忽如一夜春风来&#xff0c;亚洲天后孙燕姿独特而柔美的音色再度响彻华语乐坛&#xff0c;只不过这一次&#xff0c;不是因为她出了新专辑&#xff0c;而是人工智能AI技术对于孙燕姿音色的完美复刻&#xff0c;以大江灌浪之势对华语歌坛诸多经典作品进行了翻唱&#xff0c;还原…

李沐论文精度系列之九:InstructGPT

文章目录 一、背景1.1 时间线1.2 ChatGPT功能展示1.3 指示学习&#xff08;Instruct Learning&#xff09;和提示&#xff08;Prompt Learning&#xff09;学习1.4 人工反馈的强化学习&#xff08;RLHF&#xff09; 二、摘要三、导言3.1 算法3.2 结论 四、方法和实验细节4.1 数…

【数据结构与算法】树和二叉树

1 树 1.1 术语 关系术语 孩子结点 —— 子树的根 父结点 兄弟结点 —— 同一个结点的孩子结点互为兄弟 祖先结点 后代结点 层次类术语 根的层次为1 其余结点的层次为其父结点层次加1 高度/深度 —— 整个树中结点的最大层次 度 —— 结点的孩子数目称为结点的度 叶子&#xf…

Smartbi携手广州轻工集团打造集团价值创造型总部

广州轻工工贸集团有限公司&#xff08;简称“广州轻工集团”&#xff09;是广州市第一家工贸合一的大型企业集团公司&#xff0c;最早起源于1950年9月成立的广州市合作事业管理局&#xff0c;逐渐演化形成广州市轻工业局。1995年10月&#xff0c;广州市轻工业局成建制改建为经济…

spring-transaction源码分析(3)Transactional事务失效原因

问题概述 在Transactional方法中使用this方式调用另一个Transactional方法时&#xff0c;拦截器无法拦截到被调用方法&#xff0c;严重时会使事务失效。 类似以下代码&#xff1a; Transactional public void insertBlogList(List<Blog> blogList) {for (Blog blog : …

【人工智能】在VScode中使用AI插件Bito,功能与ChatGPT类似

文章目录 前言一、到官网下载VScode软件二、VScode软件安装步骤三、Bito插件下载与VScode软件中的使用四、注册Bito 前言 之前在VScode中使用ChatGPT中文版&#xff0c;后来要注册与收费&#xff0c;可采用一些ChatGPT中文版的替代插件。 后发现BitoAI插件功能同样强大&#…

港联证券|断臂、收缩、变阵 “中植系”何去何从?

经历灵魂人物猝然离世的巨震&#xff0c;国内最老牌资本系之一的“中植系”&#xff0c;尚未显露出穿越周期的企稳之象&#xff0c;似仍在风雨飘摇。 投资端&#xff0c;随着监管持续升级与注册制改革全面推进&#xff0c;“中植系”惯用“PE上市公司”以低买高卖的资本套利模式…

流水线三维可视化运维,装配自动化提质增效 | 设备产线管理合集

为大家带来图扑智慧生产线/设备流水线合集。依托图扑对设备加工、物流输送、车辆装配等多个车间流水线进行 3D 可视化展示&#xff0c;通过数字孪生技术推动行业数字化转型升级。 智慧仓储产线 智慧仓储产线通过对仓储现场的数字化建模&#xff0c;利用先进的物联网、大数据、…

外贸网站Magento存在漏洞导致网站被攻击入侵的防护办法

Magento是最受欢迎的外贸电商框架之一&#xff0c;很多企业已经在其基础上进行了二次开发。然而&#xff0c;对于使用2.x版本的老系统来说&#xff0c;安全问题也成为了一大难题。有些客户在找我们SINESAFE做网站安全服务之前&#xff0c;客户也找过建站的公司去清除后门&#…

学习CSS3实现夜空UFO特效,带着心上人去太空旅行

记得那是在一个夜晚&#xff0c;我下班比较晚&#xff0c;行走在空荡的街道&#xff0c;不由想起了何润东“直到整条街上剩我和路灯”的歌声&#xff0c;就这么往前走着。我走哇走&#xff0c;走哇走&#xff0c;突然&#xff0c;一道光划过&#xff0c;你猜我看见了什么&#…

GNN图神经网络

文章目录 GNN图神经网络的元素消息传递方式 GCN消息传递方式 GAT消息传递机制 GNN 图神经网络的元素 节点&#xff0c;邻接矩阵 为什么要计算多层 邻居的邻居&#xff0c;融合多阶邻居特征 消息传递方式 图神经网络是一个相对宽泛的概念&#xff0c;本质是每个节点embeddi…

【Linux】Linux下安装Docker(图文解说详细版)

文章目录 一、前言二、Docker的三要素Docker镜像Docker仓库Docker容器 三、Docker的安装1. 确定Linux版本2.安装Docker3.测试是否安装成功4.配置下载docker镜像的仓库5.测试HelloWorld镜像 一、前言 Docker是近年来新兴的虚拟化工具&#xff0c;它可以和虚拟机一样实现资源和系…

【教程】用 HTML JavaScript 制作 2.5D 迷宫游戏地图

我写了一个能够随机生成迷宫的算法&#xff0c;得到了用户很好的反响&#xff0c;对大家有所帮助。我现在想将这个迷宫以2.5D游戏地图的方式呈现出来。最初我考虑使用CSS来实现这个目标&#xff0c;但效果并不太理想&#xff0c;因为我无法只将它渲染成背景&#xff0c;而不对整…

洛谷B2096 直方图

直方图 题目描述 给定一个非负整数数组&#xff0c;统计里面每一个数的出现次数。我们只统计到数组里最大的数。 假设 F m a x &#xff08; F m a x ≤ 100000 &#xff09; Fmax&#xff08;Fmax \le 100000&#xff09; Fmax&#xff08;Fmax≤100000&#xff09;是数组…

scratch绘制直尺 中国电子学会图形化编程 少儿编程 scratch编程等级考试四级真题和答案解析2023年3月

目录 scratch绘制直尺 一、题目要求 1、准备工作 2、功能实现 二、案例分析

NSSCTF之Misc篇刷题记录⑨

NSSCTF之Misc篇刷题记录⑨ [GKCTF 2021]签到[NISACTF 2022]bmpnumber[领航杯江苏省赛 2021]签到题[鹤城杯 2021]Misc2[鹤城杯 2021]A_MISC[GXYCTF 2019]CheckIn[HDCTF 2023]hardMisc[NSSRound#1 Basic]cut_into_thirds[闽盾杯 2021]Modbus的秘密[NISACTF 2022]神秘数字[INSHack…