SQL 服务器上的缓慢插入语句
Slow insert statements on SQL Server
单个插入语句有时会超过 2 秒。插入可能是并发的,因为它取决于我们的网站流量,这可能导致每分钟 200 次插入。
table 有超过 1.5 亿行,4 个索引,使用简单的 select 语句访问以进行报告。
显示输出的索引
考虑到所有索引都是必需的,如何加快插入速度?
您没有提供很多细节,但您似乎需要分区。
数据库索引中的插入操作通常具有 O(logN) 时间复杂度,其中 N 是 table 中的行数。如果你的 table 真的很大,甚至 logN 可能会变得太多。
因此,要解决可伸缩性问题,您可以利用索引分区透明地将 table 索引拆分为更小的内部片段,并在不更改应用程序或 SQL 脚本的情况下减少 N。
https://dev.mysql.com/doc/refman/5.7/en/partitioning-overview.html
[编辑]
考虑到最初在评论中添加的信息,现在在问题本身中进行了更新。
- 每分钟 200 次潜在并发插入
- 4 个索引
- 1 select 用于报告目的
有一些不相互排斥的改进:
检查 EXPLAIN 的输出 SELECT 并删除未使用的索引,否则,将它们合并到一个索引中。
批量插入
分区仍然是一种选择。
或者,改变您的方法:将数据保存到像 redis 这样的 nosql 数据库,并异步填充 mysql table 以用于报告目的。
单个插入语句有时会超过 2 秒。插入可能是并发的,因为它取决于我们的网站流量,这可能导致每分钟 200 次插入。
table 有超过 1.5 亿行,4 个索引,使用简单的 select 语句访问以进行报告。
显示输出的索引
考虑到所有索引都是必需的,如何加快插入速度?
您没有提供很多细节,但您似乎需要分区。
数据库索引中的插入操作通常具有 O(logN) 时间复杂度,其中 N 是 table 中的行数。如果你的 table 真的很大,甚至 logN 可能会变得太多。
因此,要解决可伸缩性问题,您可以利用索引分区透明地将 table 索引拆分为更小的内部片段,并在不更改应用程序或 SQL 脚本的情况下减少 N。
https://dev.mysql.com/doc/refman/5.7/en/partitioning-overview.html
[编辑]
考虑到最初在评论中添加的信息,现在在问题本身中进行了更新。
- 每分钟 200 次潜在并发插入
- 4 个索引
- 1 select 用于报告目的
有一些不相互排斥的改进:
检查 EXPLAIN 的输出 SELECT 并删除未使用的索引,否则,将它们合并到一个索引中。
批量插入
分区仍然是一种选择。
或者,改变您的方法:将数据保存到像 redis 这样的 nosql 数据库,并异步填充 mysql table 以用于报告目的。