【问题标题】:Slow insert statements on SQL ServerSQL Server 上的慢速插入语句
【发布时间】:2017-09-04 12:00:20
【问题描述】:

单个插入语句有时会花费超过 2 秒。插入可能是并发的,因为这取决于我们的网站流量,这可能导致每分钟 200 次插入。

该表有超过 150M 的行、4 个索引,并且可以使用简单的 select 语句进行访问以进行报告。

显示输出的索引

考虑到所有索引都需要,如何加快插入速度?

【问题讨论】:

  • 索引增加了插入时间。 (还有更多工作要做……)
  • 涉及到任何触发器?
  • @jarlh:是的,这是问题所在。这就是为什么需要一个解决方案 :) 不涉及触发器。
  • 你不能同时拥有这两种方式,要么没有用于快速插入的索引,要么为更好的选择建立索引——使用你拥有的索引数量,你是否有包含一半的大索引表字段,是否有未使用的索引等...
  • 如果您在原始问题中添加详细信息,而不是在 cmets 中添加详细信息,阅读起来会容易得多。

标签: mysql sql database database-administration


【解决方案1】:

您没有提供很多详细信息,但您似乎需要分区。

数据库索引中的插入操作通常具有 O(logN) 时间复杂度,其中 N 是表中的行数。如果你的表真的很大,甚至 logN 可能会变得太多。

因此,为了解决可伸缩性问题,您可以利用索引分区将表索引透明地拆分为较小的内部部分,并在不更改应用程序或 SQL 脚本的情况下减少 N。

https://dev.mysql.com/doc/refman/5.7/en/partitioning-overview.html

[编辑]

考虑最初在 cmets 中添加的信息,现在在问题本身中更新。

  • 每分钟 200 次潜在的并发插入
  • 4 个索引
  • 1 选择用于报告目的

有一些不相互排斥的改进:

或者,改变您的方法:将数据保存到像 redis 这样的 nosql 数据库中,并异步填充 mysql 表以进行报告。

【讨论】:

猜你喜欢
  • 2015-09-21
  • 2014-02-22
  • 1970-01-01
  • 2021-10-31
  • 2012-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-01
相关资源
最近更新 更多