我可以在使用 MariaDB 或 MySQL 更新多个不同行时插入 table 吗?
Can I INSERT into table while UPDATING multiple different rows with MariaDB or MySQL?
我正在创建一个自定义分析系统,目前正在设计数据库。我打算将 MariaDB 与 InnoDB 引擎一起使用,以便能够处理大负载。
我预期的数据可能在 500k 左右 clicks/day。我需要将这些行插入到数据库中,这意味着我平均有 5.8 inserts/sec 左右。但是,与此同时,我想记录是否有人访问了与该点击相关联的页面。 (主要是为了记录漏斗)
所以我打算做的是创建额外的列并搜索特定行的 ID,然后用访问的确切时间更新该列。
我的第一个问题:这是通常推荐的设计数据库的方法吗?如果不是,设计数据库还有什么价值?
我唯一担心的是,在更新行时 Table 将被锁定,无法进行插入,因此会降低用户体验。
我的第二个问题: 这是我应该担心的事情吗,table 在更新时被锁定,从而减慢插入速度?它会影响性能吗?
如果您正在执行更新,InnoDB 不会锁定 table 以进行插入。您的用户不会遇到任何奇怪的挂起。
这是一个 MVCC compliant engine,旨在处理对底层 table 的并发访问。
您可以通过选择一个 appropriate isolation level 来控制引擎的行为,但是默认设置 (REPEATABLE READ
) 非常好并且可以胜任这项工作。
如果 table 被多个用户修改(不是连接到您站点的用户,而是通过脚本语言或其他服务建立到 MySQL 的连接)并且有很多 inserts/updates/deletes - MySQL 可以抛出一个错误,指出发生了死锁。
死锁是警告,不是错误,表示有超过1个线程试图访问占用的资源(比如两个线程试图同时更新同一行,但只有1个线程会被允许这样做所以)。这表明您应该重复查询。
我建议您在处理 MySQL 较重的 I/O.
时,用您选择的语言处理所有可能的情况
~6 秒插入并不多,请确保您允许 MySQL 访问足够的系统资源。对于 InnoDB,稍微检查一下 innodb_buffer_pool_size
或 google 的值,看看它是什么以及如何使用它来使您的数据库 运行 快速。
祝你好运!
5.6/秒,问题不大
不过,我确实建议对 "Likes"、"Upvotes"、"Clicks" 和类似内容进行垂直分区。这些往往有很多 UPDATEs
随机单行,并且 可能 干扰其他 activity.
也就是说,有一个单独的 table,(可能)只有 2 列:
- 项目的 ID Liked/Clicked/etc。
- 一个计数器。
当您想显示包括计数器在内的信息时,通过 id
JOIN
非常简单(也足够快)。
如前所述,行被锁定,而不是table.
我正在创建一个自定义分析系统,目前正在设计数据库。我打算将 MariaDB 与 InnoDB 引擎一起使用,以便能够处理大负载。
我预期的数据可能在 500k 左右 clicks/day。我需要将这些行插入到数据库中,这意味着我平均有 5.8 inserts/sec 左右。但是,与此同时,我想记录是否有人访问了与该点击相关联的页面。 (主要是为了记录漏斗)
所以我打算做的是创建额外的列并搜索特定行的 ID,然后用访问的确切时间更新该列。
我的第一个问题:这是通常推荐的设计数据库的方法吗?如果不是,设计数据库还有什么价值?
我唯一担心的是,在更新行时 Table 将被锁定,无法进行插入,因此会降低用户体验。
我的第二个问题: 这是我应该担心的事情吗,table 在更新时被锁定,从而减慢插入速度?它会影响性能吗?
如果您正在执行更新,InnoDB 不会锁定 table 以进行插入。您的用户不会遇到任何奇怪的挂起。
这是一个 MVCC compliant engine,旨在处理对底层 table 的并发访问。
您可以通过选择一个 appropriate isolation level 来控制引擎的行为,但是默认设置 (REPEATABLE READ
) 非常好并且可以胜任这项工作。
如果 table 被多个用户修改(不是连接到您站点的用户,而是通过脚本语言或其他服务建立到 MySQL 的连接)并且有很多 inserts/updates/deletes - MySQL 可以抛出一个错误,指出发生了死锁。
死锁是警告,不是错误,表示有超过1个线程试图访问占用的资源(比如两个线程试图同时更新同一行,但只有1个线程会被允许这样做所以)。这表明您应该重复查询。
我建议您在处理 MySQL 较重的 I/O.
时,用您选择的语言处理所有可能的情况~6 秒插入并不多,请确保您允许 MySQL 访问足够的系统资源。对于 InnoDB,稍微检查一下 innodb_buffer_pool_size
或 google 的值,看看它是什么以及如何使用它来使您的数据库 运行 快速。
祝你好运!
5.6/秒,问题不大
不过,我确实建议对 "Likes"、"Upvotes"、"Clicks" 和类似内容进行垂直分区。这些往往有很多 UPDATEs
随机单行,并且 可能 干扰其他 activity.
也就是说,有一个单独的 table,(可能)只有 2 列:
- 项目的 ID Liked/Clicked/etc。
- 一个计数器。
当您想显示包括计数器在内的信息时,通过 id
JOIN
非常简单(也足够快)。
如前所述,行被锁定,而不是table.