【问题标题】:Why the TiDB performance drop for 10 times when the updated field value is random?为什么更新的字段值是随机的,TiDB 性能会下降 10 倍?
【发布时间】:2019-04-30 02:50:03
【问题描述】:

我设置了 TiDB、TiKV 和 PD 集群,以便使用 YCSB 工具对它们进行基准测试,并通过 MySQL 驱动程序连接。 集群由 TiDB、TiKV 和 PD 各 5 个实例组成。 每个节点运行一个 TiDB、TiKV 和 PD 实例。

然而,当我在更新语句中玩弄 YCSB 代码时,我注意到如果更新字段的值是固定的并且是硬编码的,那么总吞吐量约为 30K tps,延迟约为 30ms。如果更新的字段值是随机的,则总吞吐量约为 2k tps,延迟约为 300ms。

更新语句创建代码如下:


  @Override
  public String createUpdateStatement(StatementType updateType) {
    String[] fieldKeys = updateType.getFieldString().split(",");
    StringBuilder update = new StringBuilder("UPDATE ");
    update.append(updateType.getTableName());
    update.append(" SET ");
    for (int i = 0; i < fieldKeys.length; i++) {
      update.append(fieldKeys[i]);
      String randStr = RandomCharStr();  // 1) 3K tps with 300ms latency
      //String randStr = "Hardcode-Field-Value";  // 2) 20K tps with 20ms latency
      update.append(" = '" + randStr + "'");
      if (i < fieldKeys.length - 1) {
        update.append(", ");
      }
    }
    // update.append(fieldKey);
    update.append(" WHERE ");
    update.append(JdbcDBClient.PRIMARY_KEY);
    update.append(" = ?");
    return update.toString();
  }

我们如何解释这种性能差距? 是不是因为 DistSQL 查询缓存,正如 post 中所讨论的那样?

【问题讨论】:

    标签: jdbc tidb tikv


    【解决方案1】:

    我设法从这篇文章 (Same transaction returns different results when i ran multiply times) 和公关 (https://github.com/pingcap/tidb/issues/7644) 中弄清楚了这一点。 这是因为如果更新的字段与之前的值相同,TiDB 将不会执行 txn。

    【讨论】:

      猜你喜欢
      • 2012-03-08
      • 1970-01-01
      • 2020-09-04
      • 1970-01-01
      • 2013-10-15
      • 2017-11-13
      • 2017-03-03
      • 2016-05-16
      • 1970-01-01
      相关资源
      最近更新 更多