查询一个SQL.Tidb比MySQL慢0.5秒

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:3.0.9
  • 【问题描述】:

查询一个SQL.Tidb比MySQL慢0.5秒

SQL语句:

SELECT IFNULL(SUM(p_lp_amt)+SUM(f_amt)-SUM(IFNULL(p_change_amt,0))-IFNULL(SUM((SELECT
        SUM(B.p_promo_amt+B.f_promo_amt)
        FROM t_trade_order_item_promotion B WHERE B.order_id=A.id AND promotion_category='rule'
        AND cost_center='shop')),0),0) saleAmount,
        SUM(IFNULL(paid_amt,0)) onlinePayAmt,
        SUM(IFNULL(paid_amt,0)+IFNULL(p_cashpay_amt+f_cashpay_amt,0)) onlineAndCashPayAmt,
        SUM(CASE
            WHEN channel_id IN (8,32) THEN 1
            ELSE 0
            END) memberOrderCount,
        COUNT(1) orderCount
        FROM t_trade_order_header A
        LEFT JOIN t_trade_order_delivery B
        ON A.id = B.order_id
        WHERE order_status = 'os.in.progress' and order_status='os.shipping' and order_status='os.completed'
        AND channel_id IN (1,2,4,8,16,32,64)
        AND A.shop_id = "204262"

Tidb查询:

MySQL查询

你好,能否用 show create table 提供下这3个表的 schema? 另外,我发现 SQl 语句中显示的是 WHERE order_status = 'os.in.progress' and order_status='os.shipping' and order_status='os.completed' 而 TiDB 查询中显示的是 WHERE order_status IN ..., 这里能解释下吗?

您好, 方便提供下 t_trade_order_headert_trade_order_deliveryt_trade_order_item_promotion 这三个表的表结构吗?

另外可以帮看下

TiDB 中:

explain analyze SELECT IFNULL(SUM(p_lp_amt)+SUM(f_amt)-SUM(IFNULL(p_change_amt,0))-IFNULL(SUM((SELECT
        SUM(B.p_promo_amt+B.f_promo_amt)
        FROM t_trade_order_item_promotion B WHERE B.order_id=A.id AND promotion_category='rule'
        AND cost_center='shop')),0),0) saleAmount,
        SUM(IFNULL(paid_amt,0)) onlinePayAmt,
        SUM(IFNULL(paid_amt,0)+IFNULL(p_cashpay_amt+f_cashpay_amt,0)) onlineAndCashPayAmt,
        SUM(CASE
            WHEN channel_id IN (8,32) THEN 1
            ELSE 0
            END) memberOrderCount,
        COUNT(1) orderCount
        FROM t_trade_order_header A
        LEFT JOIN t_trade_order_delivery B
        ON A.id = B.order_id
        WHERE order_status = 'os.in.progress' and order_status='os.shipping' and order_status='os.completed'
        AND channel_id IN (1,2,4,8,16,32,64)
        AND A.shop_id = "204262";

和 mysql 中

explain format=json SELECT IFNULL(SUM(p_lp_amt)+SUM(f_amt)-SUM(IFNULL(p_change_amt,0))-IFNULL(SUM((SELECT
        SUM(B.p_promo_amt+B.f_promo_amt)
        FROM t_trade_order_item_promotion B WHERE B.order_id=A.id AND promotion_category='rule'
        AND cost_center='shop')),0),0) saleAmount,
        SUM(IFNULL(paid_amt,0)) onlinePayAmt,
        SUM(IFNULL(paid_amt,0)+IFNULL(p_cashpay_amt+f_cashpay_amt,0)) onlineAndCashPayAmt,
        SUM(CASE
            WHEN channel_id IN (8,32) THEN 1
            ELSE 0
            END) memberOrderCount,
        COUNT(1) orderCount
        FROM t_trade_order_header A
        LEFT JOIN t_trade_order_delivery B
        ON A.id = B.order_id
        WHERE order_status = 'os.in.progress' and order_status='os.shipping' and order_status='os.completed'
        AND channel_id IN (1,2,4,8,16,32,64)
        AND A.shop_id = "204262";

的结果,感谢

TIDB中 - haproxy

TIDB中 - 直连

MySQL中

  1. TiDB 图中执行的 sql 之前有啥不同吗(看上去之前并没有 tableDual 可以帮带上具体执行的 sql 信息吗?)
  2. MySQL 的输出可以完整给下吗?看上去下面还有内容
  3. 另外方便提供下三个表的表结构吗?从索引名称不能确定列信息

贴图不方便可以直接使用论坛文本格式或文本附件哈 谢谢

另外方便的话除了这三个表的 schema 可以帮忙提供下对应三个表的统计信息可以使用这个命令获取统计信息

curl -G "http://${tidb-server-ip}:${tidb-server-status-port}/stats/dump/${db_name}/${table_name}" > ${table_name}_stats.json

(替换变量为 tidb 服务器 ip 端口, 库名 和 三个表名分别执行)

非常感谢您的回答

图中的问题 我们觉得应该不是SQL的问题;

我现在需要达到的目的是: 如何让TIDBserver能同时计算

因为刚才我们测了 直连模式和通过haproxy模式 执行SQL的时间是基本相同的;

直连模式和通过haproxy模式 执行SQL的时间是基本相同

这个是正常的,一个 sql 到达 haproxy, haproxy 作为 4 层 TCP 代理纯做数据包转发不会实现将一个 SQL 的计算负载分解到到多个 TiDB 节点做你说的“同时计算”,只会请求一个 TiDB 节点(haproxy 后换成 MySQL 一样),所以你通过 haproxy 和直连运行时间是应该相同。 haproxy(或 F5)只是充当将多个客户端 Session 负载均衡到多个 TiDB 节点的作用(因为 mysql 协议是“建立链接,握手,持续使用一个链接发送 sql 收 sql 结果”),引入 haproxy 不会导致一个 SQL 命令被分解。

至于如何将一个 SQL 利用多个机器节点的计算能力, TiDB 实现是 TiDB-Server 完成 SQL 解析和执行计划生产,并下推到多个 TiKV-Server 进行并行处理(可以看上图执行计划中的 Task 列为 Cop 的节点就是可以通过增加 TiKV scale 的算子)。

也可以通过文档了解 TiDB 整体执行架构 https://pingcap.com/docs-cn/stable/architecture/

1赞

大概了解了 还得多花时间了解TIDB ,谢谢~

:+1: