最近的项目需要导入大量的数据,插入的过程中还需要边查询边插入。插入的数据量在100w左右。一开始觉得100w的数据量不大,于是就插啊插,吃了个饭,回来一看,在插入了50多w条数据后,每秒就只能插10条了。。觉得很奇怪,为啥越插越慢呢? 于是就开始分析插入的时间损耗,想到了如下的解决方案:(mysql使用的INNODB引擎)

1.分析是否是由主码,外码,索引造成的插入效率降低

主码:由于主码是每张表必须有的,不能删除。而mysql会对主码自动建立一个索引,这个索引默认是Btree索引,因此每次插入数据要额外的对Btree进行一次插入。这个额外的插入时间复杂度约为log(n)。这个索引无法删除,因此无法优化。但是每次插入的时候,由于主码约束需要检查主码是否出现,这又需要log(n),能否减少这个开销呢?答案是肯定的。我们可以设置主码为自增id AUTO_INCREMENT ,这样数据库里会自动记录当前的自增值,保证不会插入重复的主码,也就避免了主码的重复性检查。

外码:由于我的项目的插入表中存在外码,因此每次插入时需要在另一张表检测外码存在性。这个约束是与业务逻辑相关的,不能随便删除。并且这个时间开销应当是与另一张表大小成正比的常数,不应当越插入越慢才对。所以排除。

索引:为了减少Btree插入的时间损耗,我们可以在建表时先不建索引,先将所有的数据插入。之后我们再向表里添加索引。该方法确实也降低了时间的开销。

经过以上的折腾,再进行测试,发现速度快了一点,但是到了50w条后又开始慢了。看来问题的关键不在这里。于是继续查资料,又发现了个关键问题:

mysql插入数据变慢的原因_mysql插入数据变慢的原因相关推荐

  1. mysql更新数据能回滚吗_mysql更新数据能回滚吗?如何实现呢?

    不熟悉使用mysql数据库的朋友们,可能会对其有非常多的小问题,例如说,mysql更新数据可以回滚吗?我们应该如何去实现呢? 操作数据库时候难免会因为"大意"而误操作,需要快速恢复 ...

  2. mysql插入数据返回主键值_Mysql插入记录后返回该记录ID

    最近和Sobin在做一个精品课程的项目,因为用到一个固定的id作为表间关联,所以在前一个表插入数据后要把插入数据生成的自增id传递给下一个表.研究了一番决定使用Mysql提供了一个LAST_INSER ...

  3. mysql表中的中文是乱码_mysql插入表中的中文显示为乱码或问号的解决方法

    版权声明:本文为博主原创文章,未经博主允许不得转载. 今天在做ssh的博客项目时发现mysql数据库中的中文显示为问号,网上查阅了很多资料,都不是很全,所以我总结一下,供大家参考和自己复习. 1.我的 ...

  4. mysql启动不了的原因_mysql启动不了是什么原因

    mysql启动不了的常见原因与解决办法: 1.mysql配置文件设置错误 A.首先查找mysql对应的配置文件my.ini 如果服务是使用指定的配置文件启动,到对应的文进行修改(文件的位置从控制面板中 ...

  5. mysql查询含有某个值的表_MYSQL查询数据表中某个字段包含某个数值

    当某个字段中字符串是"1,2,3,4,5,6"或者"123456" 查询数据表中某个字段是否包含某个值 1:模糊查询  使用like select * from ...

  6. mysql 目录迁移 表找不到_MySQL 数据文件迁移找不到表

    需要对一个生产库做一个repication,需要将master的数据导入到slave.个人觉得使用mysqldum在导入的时候比较费时(的确比较费时) 所以想偷懒,记录下master的index和po ...

  7. mysql insert id菜鸟_MySQL 插入数据

    MySQL 插入数据 MySQL 表中使用INSERT INTOSQL语句来插入数据. 你可以通过 mysql> 命令提示窗口中向数据表中插入数据,或者通过PHP脚本来插入数据. 语法 以下为向 ...

  8. mysql插入语句例句_MySQL 插入/添加数据语句(INSERT INTO)用法详解

    MySQL 插入数据操作使用 INSERT INTO 语句,它属于 DML(数据操作语言)范畴,该语句插入方式支持从简单的添加操作到唯一键(唯一索引)冲突时的更新操作,同时也支持查询结果直接插入操作. ...

  9. mysql 字段写入_MySQL为数据表的指定字段插入数据

    username not null 没有默认值/有默认值   insert不插入username字段 均不报错 2014年07月23日21:05    百科369 MySQL为数据表的指定字段插入数据 ...

最新文章

  1. 通用兄弟元素选择器 E ~ F
  2. 最大后验估计_PR Ⅱ:贝叶斯估计/推断及其与MAP的区别
  3. Node跨域cors模块,nodejs+express跨域
  4. Linux神器strace的使用方法及实践
  5. token 微信access 过期_如何设计 QQ、微信等第三方账号登陆 ?以及设计数据库表!...
  6. 互联网浏览本地html,如何加载本地HTML文件,如果没有互联网连接
  7. php 防微信照片上传,PHP仿微信多图片预览上传功能
  8. 涂鸦板制作教程——其中的重做和撤消我觉得不错
  9. .net平台下的手机在线wap网站模拟器(附源代码)
  10. selenium自动化看网课
  11. Redis学习记录(菜鸟教程学习)
  12. 单片机原理及接口技术第1章
  13. 为什么大厂程序员的另一半全职太太比例特别多?
  14. 淘宝app搜索排名优化技巧
  15. 什么是十六进制法_什么是十六进制-十六进制详解-嗨客网
  16. 第一个用计算机编舞的人,多媒体平台·虚拟人·数字舞蹈
  17. 衣服挂牌 挂牌吊牌(麻绳,五彩绳,尼龙绳等)
  18. ramdisk和linux PE,[PE教程]WINPE下如何再建一个Ramdisk盘
  19. JS的变量,使用strict模式
  20. Git 派生属于自己的分支

热门文章

  1. html 点击增加样式,js点击添加css样式 css添加jq点击事件 JavaScript点击增加css样式...
  2. intel clear linux 教程,英特尔ClearLinux安装教程
  3. 工程伦理2019春季学堂学分课(慕课平台)(含期末考试答案)
  4. 重启网卡提示Bringing up interface eth0:
  5. updater-script 刷机脚本语法
  6. python3 copy和deepcopy
  7. RationalDMIS 7.1 状态区-测量设置
  8. 计算机毕业设计之微信小程序的快递取件及上门服务系统的论文
  9. 4位递增计数器的设计(详解并附有代码)
  10. 【mysql新加不了中文】Error Code: 1366. Incorrect string value: ‘\xE7\xBA\xB8\xE7\xB1\xBB‘ for colum