Почему производительность TiDB падает в 10 раз, когда обновленное значение поля является случайным? - PullRequest
1 голос
/ 30 апреля 2019

Я настроил кластер TiDB, TiKV и PD, чтобы сравнить их с инструментом YCSB, подключенным драйвером MySQL. Кластер состоит из 5 экземпляров для каждого из TiDB, TiKV и PD. Каждый узел запускает один экземпляр TiDB, TiKV и PD.

Однако, когда я играю с кодом YCSB в операторе обновления, я замечаю, что если значение обновленного поля является фиксированным и жестко заданным, общая пропускная способность составляет ~ 30 Кбит / с, а задержка - ~ 30 мс. Если обновленное значение поля является случайным, общая пропускная способность составляет ~ 2 Кбит / с, а задержка составляет около ~ 300 мс.

Код создания оператора обновления выглядит следующим образом:


  @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, о чем говорилось в этом посте ?

1 Ответ

0 голосов
/ 02 мая 2019

Мне удалось выяснить это из этого поста ( Та же транзакция выдает разные результаты, когда я умножился ) и pr (https://github.com/pingcap/tidb/issues/7644).). Это потому, что TiDB не будет выполнять txn, еслиобновленное поле идентично предыдущему значению.

...