【问题标题】:Inserting records into MySQL via sqlx gets very slow at some point通过 sqlx 将记录插入 MySQL 有时会变得非常慢
【发布时间】:2023-01-17 20:22:49
【问题描述】:

使用:

sqlx = { version = "0.6.2", features = ["runtime-tokio-native-tls", "mysql"] }

当我运行以下代码时(在发布模式)针对在同一台机器上运行的 MySQL 8.0.31 服务器(无 AUTO_COMMIT):

let mut tx = pool.begin().await?;
for i in 0..1_000 {
    let q = &format!("INSERT INTO tbl_abc(some_col) VALUES ({i})");
    sqlx::query(q).execute(&mut tx).await?;
}
tx.commit().await?;

,需要超过 40 秒才能完成(每条记录约 40 毫秒)。插入较少的记录,例如 50-100,是可以的(每条记录约 0.12 毫秒)。

连接池的大小似乎并不重要(不是应该的,而是我尝试过的,以防万一)。

【问题讨论】:

    标签: rust rust-sqlx


    【解决方案1】:

    好的,我发现发生了什么。他们有这个 statement_cache_capacity 设置,默认值为 100。我尝试将其更改为不同的值,而这正是插入速度变得非常慢的点。

    在尝试运行相同的代码但使用动态参数后,问题消失了:

    let q = "INSERT INTO tbl_abc(some_col) VALUES (?)";
    for i in 0..1_000 {
        sqlx::query(q).bind(i).execute(&mut tx).await?;
    }
    

    以上所有 1,000 条记录花费了大约 70 毫秒(每条记录 0.07 毫秒)。

    显然,出于某种原因,查询缓存在 sqlx 中似乎效率很低,尤其是当它需要从其缓存中删除旧的缓存查询时。在许多情况下(如我的简单示例),仅使用动态参数是可以的,但不幸的是,这并不总是可能的(或可取的)。

    【讨论】:

      猜你喜欢
      • 2014-02-27
      • 1970-01-01
      • 2017-06-18
      • 2017-04-02
      • 1970-01-01
      • 2013-12-16
      • 1970-01-01
      • 2021-11-22
      • 1970-01-01
      相关资源
      最近更新 更多