关于数据库优化3——在数据库插入、更新大量数据的性能优化

  在真实的业务场景中,我们肯定是遇到过有时候需要大批量的数据要进行入库或者是更新。这时候我们在执行这种插入,或者是更新的时候肯定会遇到数据库效率的问题,我们首先能想到的是让事物尽量保持一致,统一去提交事务,这样肯定会有一定的效率提示。

  ok。在我们在考虑了这个事情之后,我们可以在来看一下表里是否存在索引,如果存在索引,我们可以做一个这样的操作:首先在插入大量数据的时候,先把索引废除掉,等插入完成后在把索引重新建立。我在这里做了一个简单的实验,整理了一下实验的结果,有了下面的一个执行效率的图。

  

  实验是我们有一张T表,T表中有29W左右的数据,首先我们为T表建立N个索引,在去插入T表一遍原有的数据是15秒,而T表中没有索引的时候我们插入的时间是2秒左右,但是索引建立的时间慢了一点,但是肯定不会超过15秒,所以我们效率的提升还是很明显的。(T表建立这么多索引只是为了实验效果明显一些,是为了弥补数据量没有那么大)

  这个时候我们可以总结一下:在插入数据之前先让索引暂时失效,插入完成之后,我们在重新建立索引,虽然在插入完成后再去重新建立索引。有了这样的操作我们的大批量的数据操作的效率会提升很多,但是需要注意的是,在重建索引的时候如果那张表在其他地方使用中,有可能会导致索引的建立失败,所以这种操作适合在系统使用量比较小的时候使用,例如在执行定时任务的时候,或者深夜需要更新或插入大量数据的时候去做。

  索引会导致插入或者更新慢的原因:因为索引是需要维护的当数据越大,索引需要维护的量越大,而这个维护的操作需要的代价是很高的,所以上面的操作可以使大批量的新增或者更新有了飞的提升。(其实,这个实验是源于我们公司有个需求是每天在一个时间需要进行大批量的插入和更新,本来是有这样的操作,但是公司请了一个DBA之后,DBA觉得这个操作是没有必要的,当时又没有人知道这个操作是为了什么,就让我们去掉这个操作,在他们私下讨论中我偶然听到说我们开发水平低,对于数据库的机制不了解,所以才有这些没用的操作,我就很不服,所以才有了以上的实验)

时间: 2024-10-22 02:58:15

关于数据库优化3——在数据库插入、更新大量数据的性能优化的相关文章

数据库插入或者更新大批量数据的性能优化

对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长.特别像报表系统,每天花费在数据导入上的时间可能会长达几个小时或十几个小时之久.因此,优化数据库插入性能是很有意义的. 经过对MySQL InnoDB的一些性能测试,发现一些可以提高insert效率的方法,供大家参考参考. 1.一条SQL语句插入多条数据 常用的插入语句如: INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUE

从数据库、代码和服务器对PHP网站Mysql做性能优化

数据库优化是PHP面试几乎都会被问到的事情,也是我们工作中应该注意的事情,当然,如果是小网站无所谓优化不优化,网站访问量大了自然会暴漏数据库的瓶颈,这个瓶颈是各方面问题综合导致的,下面我们来做下数据库优化的总结. 一:对数据库优化 1.创建索引 对于查询占主要的应用来说,索引显得尤为重要.很多时候性能问题很简单的就是因为我们忘了添加索引而造成的,或者说没有添加更为有效的索引导致.如果不加索引的话,那么查找任何哪怕只是一条特定的数据都会进行一次全表扫描,如果一张表的数据量很大而符合条件的结果又很少

Qt高级——Qt数据可视化性能优化

Qt高级--Qt数据可视化性能优化 一.数据可视化简介 1.数据可视化简介 数据可视化即采用图形图表等对采集的数据进行展示,可以非常直观的查看传感器采集到的数据.本文将使用Qt的标准组件QTableWidget.标准模型.自定义模型分别实现对数据的表格展示. 2.系统环境 个人PC:ThinkPad T450操作系统:RHEL7.3 WorkStation内存容量:8G磁盘容量:SSD 100GCPU:Intel(R) Core(TM) i5-5200U CPU @ 2.20GHz 二.标准界面

Kettle增量插入更新所有数据都拒绝情况处理

在一个Kettle中,我发现一个平时正常跑的转换,突然不正常了.他增量查询没问题,但是到插入更新的那一步,所有数据都拒绝,而且报错看不出什么. 经过排查,所有的写的步骤都是正确的,但是就是不进库.后来,我把所有的步骤重新新建,然后就可以了!!!再后来,我又遇到这种情况,然后把增量查询的sql重新复制,粘贴进去,再保存一下,也正常进库了.可能是kettle识别有问题把?? 原文地址:https://blog.51cto.com/newcourage/2400620

Sqlite大数据写入性能优化

众所周知,Sqlite是一个轻量级的数据库,仅仅需要一个exe文件就能运行起来.在处理本地数据上,我比较喜欢选择使用它,不仅是因为他与sql server有着比较相近的语法,还因为它不需要安装,仅需要通过命令行就能启动了,而且他在处理大数据时,性能比sql server好很多,好吧这里不继续争论性能优劣. 首先,这次的问题是在一次项目中遇到的,项目要求能大量导入数据,而且由于项目性质(轻便,本地化),所以我选择sqlite来存放数据. 第一版代码: 1 StringBuilder sql = n

Django之使用redis缓存session,历史浏览记录,首页数据实现性能优化

Redis缓存session 配置Django缓存数据到redis中 # diango的缓存配置 CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", # 用户的session信息,历史浏览记录存储在redis数据库9中 "LOCATION": "redis://127.0.0.1:6379/9", "OPTIONS

【转】mongodb可以通过profile来监控数据 (mongodb性能优化)

开启 Profiling  功能 ,对慢查询进行优化: mongodb可以通过profile来监控数据,进行优化. 查看当前是否开启profile功能用命令 db.getProfilingLevel()  返回level等级,值为0|1|2,分别代表意思:0代表关闭,1代表记录慢命令,2代表全部 db.setProfilingLevel(level);  #level等级,值同上 level为1的时候,慢命令默认值为100ms,更改为db.setProfilingLevel(level,slow

插入,更新,删除数据

数据插入 INSERT是用来插入或者添加行到数据库表的,插入可以分为几种方法 插入完整的行 插入行的一部分 插入多行 插入某些查询的结果 插入完整的行 mysql> INSERT INTO customers VALUES(NULL, 'zhangsan', 'shandong', NULL, NULL, NULL, NULL, '15053631234', '[email protected]'); Query OK, 1 row affected (0.01 sec) 此例子插入一个新客户到

ORACLE no1 存储过程插入更新表数据

CREATE OR REPLACE PROCEDURE sp_cust_main_data_yx(InStrDate  IN VARCHAR2,                                                 OS_ERR_MSG OUT VARCHAR2) AS BEGIN  --1.清空临时表数据  execute immediate 'truncate table DATA_SALE_DAY_ITEM';  execute immediate 'trunca