受Model 3注册量下降影响,一季度特斯拉在加州的汽车注册量同比小幅下降
06-18
一、SQL优化 1、高效添加数据的几种方式 普通插入(Insert语句) 我们先回顾一下向数据库添加数据的基本操作: 当我们要向数据库添加数据时数据库向表tb插入一条数据时,可以使用insert into语句: 代码语言:sql copy insert into tb Values(1,'value1');当我们要向数据库中插入多条数据时,可以执行多个insert into语句:代码语言:sql copy insert into tb1 values(1,'value1');insert into tb2 values(2,'value2'); insert into tb3 values(3,'value3');....但是当你要插入大量数据时,行数会非常密集,代码需要多次请求数据库。每个请求都会消耗一定的性能。
如何优化呢?优化方案一:一般采用批量插入的方式,让添加数据更加高效。批量插入的思想是将多行数据压缩为一行。
只需要远程请求数据库一次,代码比较简洁,但可以一次性批量插入数据。建议控制在bar以内。
如果有多个条,您应该分多个批次处理代码。语言:sql 复制 插入 tb 值(1,'value1'),(2,'value2'),(3,'value3');优化2:手动控制事务 通过手动控制事务来添加数据有很多好处。
一般来说,MySQL会自动为每个insert语句创建一个事务,这可能会导致大量的日志记录,从而降低系统性能。通过手动控制事务,可以将多个执行单元组合成单个事务,从而避免多个事务的开销。
手动控制事务可以帮助我们保证数据的完整性和一致性。反例: 代码语言:sql copy Insert into tb values(1,'value1'),(2,'value2'),(3,'value3');Insert into tb values(4,'value1'),(5 , 'value2'),(6,'value3');插入到tb中values(7,'value1'),(8,'value2'),(9,'value3');正例:代码语言:sql copy start transaction;Insert into tb values(1,'value1'),(2,'value2'),(3,'value3');Insert into tb values(4,'value1') ,(5,'value2'),(6,'value3');插入tb中values(7,'value1'),(8,'value2'),(9,'value3');commit;优化计划3 :主键无论数据量多少都是顺序插入的。
建议使用主键顺序插入来添加数据。主键顺序插入的性能比乱序插入的性能要高。
原理请参见后续主键优化部分。代码语言:sql copy #主键乱序插入:6 2 9 7 2 #主键顺序插入:1 2 4 6 8 优化方案4:加载指令添加数据 如果需要插入大量数据一次(如数百万条记录),使用insert语句可能需要几十分钟。
这时候就可以使用MySQL数据库提供的load命令了。这个过程只需要几十秒。
如何使用load命令大量添加数据?如果是常规连接数据库,则只需要输入以下指令: 代码语言:sql copy mysql -u root -p 如果需要使用load命令,则需要额外添加-local-infile参数:代码语言:sql copy mysql --local-infile -u root -p 将全局参数local_infile设置为1,并打开从本地加载文件导入数据的开关: 代码语言:sql copy set global local_infile = 1;我们还可以提前使用以下命令检查local_infile全局参数是否打开:如果local_infile显示为0,则说明开关没有打开,需要手动设置为1。代码语言:sql copy select @@local_infile;结果如下: 例如:假设要上传10000条数据,上传的文件路径为“/root/load_user_w_sort.sql”,则将完整负载的数据添加到表tb1中。
代码语言: sql 将本地 infile '/root/load_user_w_sort.sql' 加载数据复制到表 tb1 中,字段以 ',' 结尾,行以 '\n' 结尾;其中load data local infile是固定格式; into table tb1 表示向表tb1添加数据;以“,”结尾的字段表示用逗号分隔各个字段;以“\n”结尾的行表示使用换行符来分隔每一行。 2、主键优化原理 为什么主键顺序插入的性能比乱序插入的性能好?首先了解一下数据在InnoDB存储引擎中是如何组织的:在InnoDB存储引擎中,表数据是按照主键顺序组织和存储的。
采用这种存储方法的表称为索引组织表。在索引组织表中,页是InnoDB磁盘管理的最小单位,固定大小为16K。
页面可以是空的、半满的或全满的。每页至少包含2行数据(如果只包含一行数据,则为链表结构;如果一行数据太大超过阈值,会导致行溢出),按照主键。
页面拆分和页面合并时按主键顺序添加数据的过程是怎样的?主键是顺序插入的,即先填写第一页的数据。如果第一页已满,则写在第二页,以此类推。
从磁盘申请一个页面。主键按顺序插入。
当第一个页面保存完毕后,会继续申请第二个页面,页面之间通过双向指针连接;当第二页也满时,再申请第三页;通过主键乱序添加数据的过程是怎样的?主键是乱序插入的,而不是向后插入的。由于叶子节点的主键是有序的,因此会发生分页。
假设第1页和第2页已满,此时要插入主键50。新页不会直接写入,因为索引结构的叶节点是有序的。
按照顺序,主键50应该存储在47之后。但是第1页显然已经满了,那么就会进行“分页”的过程,即先打开第三页,然后再打开后半页将第1页的数据移至第3页,然后将50插入第3页。
最后将2#和3#两页的位置交换,以符合主键排序规则。最终的过程如下: 与页拆分相反,还有页合并现象:当一行记录被删除时,该记录实际上并没有被物理删除,而是被标记为删除,其空间变得允许被其他记录使用声明。
当一个页面中删除的记录数量达到MERGE_THRESHOLD(默认为页面的50%)时,InnoDB将开始寻找最接近的页面(之前或之后),看看是否可以合并两个页面以优化空间使用。最后删除2#中标记的数据,同时合并2#和3#: 3.总结 插入多条数据时,尽量选择批量插入,因为批量插入只需要对数据库进行一次远程请求,插入多条数据代码更加简洁。
插入时,尽量选择手动控制事务插入,因为通过手动控制事务,可以将多个执行单元合并为一个事务,从而避免多个事务的开销,同时保证数据的完整性和一致性。当插入大量数据时,MySQL提供的load指令比Insert语句效率更高。
插入数据时,尽量按照主键顺序插入,并使用AUTO_INCREMENT主键自增。因为当主键乱序插入时,会发生“分页”,消耗性能。
尽量不要使用UUID作为主键或者其他自然主键,比如ID号。由于每次生成的UUID都是乱序的,插入时主键乱序插入,会出现“分页”,消耗性能,避免业务操作时修改主键。
因为修改主键后,还需要修改索引结构,成本较高。在满足业务需求时,尽量减少主键的长度。
版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
标签:
相关文章
06-17
06-18
06-17
06-18
最新文章
【玩转GPU】ControlNet初学者生存指南
【实战】获取小程序中用户的城市信息(附源码)
包雪雪简单介绍Vue.js:开学
Go进阶:使用Gin框架简单实现服务端渲染
线程池介绍及实际案例分享
JMeter 注释 18 - JMeter 常用配置组件介绍
基于Sentry的大数据权限解决方案
【云+社区年度征文集】GPE监控介绍及使用