如果更新的字段值是随机的,为什么TiDB性能会下降10倍?

时间:2019-04-30 02:50:04

标签: jdbc tidb tikv

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

但是,当我在update语句中播放YCSB代码时,我注意到,如果update字段的值是固定的并经过硬编码的,则总吞吐量约为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();
  }

我们如何解决这一性能差距? 如post所述,这是由于DistSQL查询缓存引起的吗?

1 个答案:

答案 0 :(得分:0)

我设法通过这篇文章(Same transaction returns different results when i ran multiply times)和pr(https://github.com/pingcap/tidb/issues/7644)来解决这个问题。 这是因为如果更新的字段与先前的值相同,则TiDB将不会执行txn。