Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL Server上的慢速insert语句_Mysql_Sql_Database_Database Administration - Fatal编程技术网

Mysql SQL Server上的慢速insert语句

Mysql SQL Server上的慢速insert语句,mysql,sql,database,database-administration,Mysql,Sql,Database,Database Administration,单个insert语句有时需要2秒以上的时间。这些插入可能是并发的,因为这取决于我们的站点流量,这可能导致每分钟200次插入 该表有超过1.5亿行、4个索引,并且出于报告目的,可以使用简单的select语句进行访问 显示来自ouptut的索引 考虑到所有索引都是必需的,如何加快插入速度?您没有提供很多详细信息,但似乎需要分区 数据库索引中的插入操作通常具有O(logN)时间复杂度,其中N是表中的行数。如果你的桌子真的很大,连logN都可能变得太多 因此,为了解决这个可伸缩性问题,您可以使用索引分

单个insert语句有时需要2秒以上的时间。这些插入可能是并发的,因为这取决于我们的站点流量,这可能导致每分钟200次插入

该表有超过1.5亿行、4个索引,并且出于报告目的,可以使用简单的select语句进行访问

显示来自ouptut的索引


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

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

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

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

[编辑]

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

  • 每分钟200次潜在并发插入
  • 4个索引
  • 1为报告目的选择
有一些并非相互排斥的改进:

  • 检查EXPLAIN的输出,以确定未使用的SELECT和remove索引,或者将它们合并到一个索引中

  • 成批制作插页

  • 分区仍然是一种选择


或者,改变方法:将数据保存到nosql数据库(如redis)中,并异步填充mysql表以进行报告。

索引会增加插入时间。(还有更多的工作要做…)有什么触发因素吗?@jarlh:是的,这就是问题所在。这就是为什么需要一个解决方案:)不涉及触发器。你不可能两种方式都有,要么没有用于快速插入的索引,要么为更好的选择而索引-利用你拥有的索引数量,是否有包含一半表字段的大索引,是否有未使用的索引等…如果你在原始问题中添加了详细信息,与其在评论中添加细节,不如更容易阅读。谢谢@olivecoder的建议。我正在寻找您共享的分区。我会在这里告诉你我的发现。我在这里分享了一些细节