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