mysql技术专题「性能优化系列」一直都倾向于优化查询,这次学习一下优化insert插入语句(代码片段)

洛神灬殇 洛神灬殇     2023-03-08     231

关键词:

分析一下插入数据的因素

插入一个记录需要的时间由下列因素组成,大概分析相关的因素百分比是?

  • 连接耗时:百分之30的因素
  • 发送查询给服务器耗时:百分之20的因素
  • 分析查询耗时:百分之20的因素
  • 插入记录耗时:百分之10的因素
  • 插入索引耗时:百分之10的因素
  • 关闭连接耗时:百分之10的因素

如果不考虑打开表的初始开销,每个并发运行的查询打开表的大小以logN (B树)的速度减慢索引的插入。

如何加快插入数据的方案

合并插入SQL的语句操作

如果同时从同一个客户端插入很多行,使用含多个VALUE的INSERT语句同时插入几行。这比使用单行INSERT语句快(在某些情况下快几倍)。

调节批次插入的缓冲池大小

如果你正向一个非空表添加数据,可以调节bulk_insert_buffer_size变量,使数据插入更快。

采用Insert Delayed语句进行插入操作控制

如果你从不同的客户端插入很多行(无法合并SQL语句的操作处理),能通过INSERT DELAYED语句加快速度。

INSERT DELAYED 语法
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name [(col_name,...)]
    VALUES (expr | DEFAULT,...),(...),...
    [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

或:

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name
    SET col_name=expr | DEFAULT, ...
    [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

用于INSERT语句的DELAYED选项是MySQL相对于标准SQL的扩展,如果您的客户端不能等待INSERT完成,则这个选项是非常有用的。

  • 当您使用MySQL进行日志编写时,这是非常常见的问题。您也可以定期运行SELECT和UPDATE语句,这些语句花费的时间较长。

  • 当客户端使用INSERT DELAYED时,会立刻从服务器处得到一个确定。并且行被排入队列,当表没有被其它线程使用时,此行被插入。

  • 使用INSERT DELAYED的另一个重要的好处是,来自许多客户端的插入被集中在一起,并被编写入一个块。这比执行许多独立的插入要快很多。

使用DELAYED时有一些限制

  • INSERT DELAYED仅适用于MyISAM, MEMORY和ARCHIVE表。对于MyISAM表,如果在数据文件的中间没有空闲的块,则支持同时采用SELECT和INSERT语句。

  • 在这些情况下,基本不需要对MyISAM使用INSERT DELAYED。

  • INSERT DELAYED应该仅用于指定值清单的INSERT语句。

  • 服务器忽略用于INSERT DELAYED…SELECT语句的DELAYED。

  • 服务器忽略用于INSERT DELAYED…ON DUPLICATE UPDATE语句的DELAYED。

As of MySQL 5.6.6, INSERT DELAYED is deprecated; expect it to be removed in a future release. Use INSERT (without DELAYED) instead.

  • 因为在行被插入前,语句立刻返回,所以您不能使用LAST_INSERT_ID()来获取AUTO_INCREMENT值。AUTO_INCREMENT值可能由语句生成。

  • 对于SELECT语句,DELAYED行不可见,直到这些行确实被插入了为止。DELAYED在从属复制服务器中被忽略了,因为DELAYED不会在从属服务器中产生与主服务器不一样的数据。

注意,目前在队列中的各行只保存在存储器中,直到它们被插入到表中为止。这意味着,如果您强行中止了mysqld(例如,使用kill -9)或者如果mysqld意外停止,则所有没有被写入磁盘的行都会丢失。

以下详细描述了当您对INSERT或REPLACE使用DELAYED选项时会发生什么情况, 在这些描述中,“线程”指的是已接受了一个INSERT DELAYED语句的线程,“管理程序”指的是为某个特定的表处理所有INSERT DELAYED语句的线程。

当线程对一个表执行DELAYED语句时,会创建出一个管理程序线程,对用于本表的所有DELAYED语句进行处理。

  • 线程会检查是否管理程序以前已获取了DELAYED锁定;如果没有获取,则告知管理程序线程进行此项操作。即使其它线程对表有READ或WRITE锁定,也可以获得DELAYED锁定。但是管理程序会等待所有的ALTER TABLE锁定或FLUSH TABLE锁定,以确保表的结构是最新的。

  • 线程执行INSERT语句,但不是把行写入表中,而是把最终行的拷贝放入一个由管理程序线程管理的队列中。线程会提示出现语法错误,这些错误会被报告到客户端中。

采用MyISAM引擎,可以提高并发度

如果用MyISAM,如果在表中没有删除的行,能在SELECT语句正在运行的同时插入行。

直接通过文本载入

当从一个文本文件装载一个表时,使用LOAD DATA INFILE。这通常比使用很多INSERT语句快20倍。当表有很多索引时,有可能要多做些工作使得LOAD DATA INFILE更快些。

锁定表加速insert操作

  • 锁定表可以加速用多个语句执行的INSERT操作

  • 这样性能会提高,因为索引缓存区仅在所有INSERT语句完成后刷新到磁盘上一次。一般有多少INSERT语句即有多少索引缓存区刷新。如果能用一个语句插入所有的行,就不需要锁定。对于事务表,应使用BEGIN和COMMIT代替LOCK TABLES来加快插入。

  • INSERT、UPDATE和DELETE操作在MySQL中是很快的,通过为在一行中多于大约5次连续不断地插入或更新的操作加锁,可以获得更好的整体性能。如果在一行中进行多次插入,可以执行LOCK TABLES,随后立即执行UNLOCK TABLES(大约每1000行)以允许其它的线程访问表。这也会获得好的性能。

锁表
LOCK TABLES `order` WRITE;
禁用键
ALTER TABLE `order` DISABLE KEYS ;
插入数据
INSERT INTO `order` VALUES (1,11,'UPDATED');
INSERT INTO `order` VALUES (2,11,'UPDATED');
启用键
 ALTER TABLE `order` ENABLE KEYS; 
解锁表
UNLOCK TABLES;

key_buffer_size提高扩充键缓冲区

为了对LOAD DATA INFILE和INSERT在MyISAM表得到更快的速度,通过增加key_buffer_size系统变量来扩大 键高速缓冲区

参考分析

  • https://dev.mysql.com/doc/refman/5.6/en/insert-delayed.html

分布式技术专题「系统服务优化系列」web应用服务的性能指标优化开发指南(jvm篇)(代码片段)

JVM优化机制JIT编译器相关的优化对JVM性能影响最大的是编译器,选择编译器是运行java程序首先要做的选择之一。热点编译的概念对于程序来说,通常只有一部分代码被经常执行,这些关键代码被称为应用的热点,... 查看详情

推荐:java性能优化系列集锦

...经今非昔比了。现代JVM持续演进,内建了更为成熟的优化技术、运行时技术和垃圾收集器。与此同时,底层的硬件平台和操作系统也在演化。目录:一、Java性能优化系列之一--设计优化二、Java性能优化系列之二--程序优化三、Jav... 查看详情

2.18-2.24博客精彩回顾

...15.​​flutter系列之:在flutter中使用导航Navigator​​​二、专题推荐1.​​后端开发专题系列​​2.​​前端开发专题系列​​3.​​移动开发专题系列​​4.​​数据库专题系列​​5.​​人工智能专题系列​​6.​​服务器专题系... 查看详情

redis实战专题「性能监控系列」全方位探索redis的性能监控以及优化指南

Redis基本简介Redis是一个开源(BSD许可)、内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁... 查看详情

优化技术专题「系统性能调优实战」终极关注应用系统性能调手册指南(上册)

...力和层次,所以便进行先关系统性质的学习和优化相关的技术做了一定的研究。调优背景因为当出现吞吐远远不能够满足我们客户或者我们需要的呼叫了指标的时候因为出现了这么一次情况,虽然没有给用户没有给公司带来什么... 查看详情

redis实战专题「性能监控系列」全方位探索redis的性能监控以及优化指南(代码片段)

Redis基本简介Redis是一个开源(BSD许可)、内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合等数据类型。内置复制、Lua脚本、LRU收回、事务以... 查看详情

优化技术专题「系统性能调优实战」终极关注应用系统性能调优及原理剖析(下册)

前提介绍承接上文:【优化技术专题】「系统性能调优实战」终极关注应用系统性能调优及原理剖析(上册)之后我们接下来进行相关的。流程相关分析优化通过access_log.txt日志分析,在特定时间段内,将请求至系统的url分组计... 查看详情

ios进阶开发-ios性能优化-关东升-专题视频课程

iOS进阶开发-iOS性能优化—3316人已学习课程介绍        介绍了性能优化方法,其中包括内存优化、资源文件优化、延迟加载、持久化优化、使用可重用对象和并发访问等。这些内容都是非常重要的,... 查看详情

mysql性能优化

1.MySQL索引优化mysql客户端通过协议与mysql服务器建立连接,发送查询语句,先检查查询缓存,如果命中,直接返回结果,否则进行语句解析,有一系列预处理,比如检查语句是否写正确了,然后是查询优化(比如是否使用索引扫... 查看详情

前端性能优化(一)

参考技术A最近跟同事一直忙于关于前端项目的性能分析以及性能优化,前端性能直接影响了用户的体验,针对于前端性能问题,一直是一个大家热议的话题,也并没有一个比较完整通用的解决方案,以下是我个人的一些认识与... 查看详情

mysql系列-性能优化神器explain使用介绍及分析(代码片段)

简介 MySQL提供了一个EXPLAIN命令,它可以对 SELECT 语句进行分析,并输出 SELECT 执行的详细信息,以供开发人员针对性优化。 EXPLAIN命令用法十分简单,在SELECT语句前加上Explain就可以了,例如:EXPLAINSELECT*fromuser_infoWHEREid<... 查看详情

移动端性能优化系列—启动速度

简介: 移动端性能对用户体验、留存有着至关重要的影响,作为开发者是不是被这样吐槽过,“这个APP怎么这么大?”、“怎么一直在APP封面图转悠,点不进去”、“进入详情效果有些卡”、“用4G使用你们... 查看详情

大厂首发!mysqldateadd函数

...师,性能优化就是你必须思考的问题。所以性能优化专题从JVM底层原理到内存优化再到各个中间件的性能调优,比如Tomcat调优,MySQL调优等& 查看详情

mysql优化总结(代码片段)

...风险,只不过我们可能没有能力意识到和预见到!任何的技术可以解决一个问题,但必然存在带来一个问题的风险!对于优化来说解决问题而带来的问题,控制在可接受的范围内才是有成果,保持现状或出现更差的情况都是失败... 查看详情

性能优化方法论系列三性能优化的核心思想(代码片段)

3.3提高资源利用率3.3.1空间换时间空间换时间是性能优化最常用的手段之一。其中缓存就是空间换时间的一种典型应用。CPU缓存、浏览器缓存、CDN缓存、DNS缓存、内存缓存、Redis缓存等,它们都是将数据缓存在离使用者更近的... 查看详情

前端性能优化——起步篇

...。把用户伺候舒服了,才会产生长久的依赖。我认为前端性能优化的实践应当是自动化的,智能化的,从代码编写到生产打包一整套流程都应该有一系列关于优化的应对方案。 我个人认为nodejs相对于我们前端来说作为代码管... 查看详情

mysql技术专题「索引技术」体验前所未有的技术探险,看穿索引的本质和技术体系

文章目录前提概要数据库类型内容架构索引和磁盘的关系数据读取时主要时间开销总结分析瓶颈点优化的方式数据量计算传统暴力(顺序型读写)X索引机制(半随机性读写)√索引升级之多级索引化(全随机... 查看详情

性能优化系列三:jvm优化1

一、几个基本概念GCRoots对象都有哪些所有正在运行的线程的栈上的引用变量。所有的全局变量。所有ClassLoader。。。1.SystemClass.2.JNILocal3.JNIGlobal4.ThreadBlock5.BusyMonitor6.JavaLocal7.NativeStack8.Unfinalized9.Unreachable10.JavaStackFrame11.Unknow 查看详情