首页 > 数据库 >【第31天】MYSQL进阶-写优化- 插入优化(SQL 小虚竹)

【第31天】MYSQL进阶-写优化- 插入优化(SQL 小虚竹)

时间:2023-04-28 13:33:16浏览次数:42  
标签:唯一性 数据 进阶 索引 禁用 插入 引擎 虚竹 优化


回城传送–》《100天精通MYSQL从入门到就业》

文章目录

  • 零、前言
  • 一、练习题目
  • 二、SQL思路:SQL进阶-写优化-插入优化
  • 解法
  • 插入优化
  • 禁用索引
  • 语法如下
  • 适用数据库引擎
  • 非空表:禁用索引
  • 禁用唯一性检查
  • 语法如下
  • 适用数据库引擎
  • 禁用外键检查
  • 语法如下
  • 适用数据库引擎
  • 批量插入数据
  • 语法如下
  • 适用数据库引擎
  • 批量导入数据
  • 语法如下
  • 适用数据库引擎
  • 禁用事务自动提交
  • 语法如下
  • 适用数据库引擎
  • 三、总结
  • 四、参考

零、前言

今天是学习 SQL 打卡的第 31 天,每天我会提供一篇文章供群成员阅读( 不需要订阅付钱 )。

希望大家先自己思考,如果实在没有想法,再看下面的解题思路,自己再实现一遍。在小虚竹JAVA社区 中对应的 【打卡贴】打卡,今天的任务就算完成了,养成每天学习打卡的好习惯。

虚竹哥会组织大家一起学习同一篇文章,所以有什么问题都可以在群里问,群里的小伙伴可以迅速地帮到你,一个人可以走得很快,一群人可以走得很远,有一起学习交流的战友,是多么幸运的事情。

我的学习策略很简单,题海策略+ 费曼学习法。如果能把这些题都认认真真自己实现一遍,那意味着 SQL 已经筑基成功了。后面的进阶学习,可以继续跟着我,一起走向架构师之路。

今天的学习内容是:SQL进阶-写优化- 插入优化

一、练习题目

题目链接

难度

SQL进阶-写优化- 插入优化

★★★☆☆

二、SQL思路:SQL进阶-写优化-插入优化

【第31天】MYSQL进阶-写优化- 插入优化(SQL 小虚竹)_数据库


【第31天】MYSQL进阶-写优化- 插入优化(SQL 小虚竹)_java_02

解法

要求处理:

  • 从四个选项中选择一个正确答案

插入优化

往表中插入数据时,会受索引,唯一性校验,外键检查和事务自动提交等原因会影响插入的效率。以下会分别介绍各种优化的方式。

禁用索引

在(非空表)插入大量数据时,可以先禁用索引,等数据插入完成,再启用索引。达到提高插入性能。
注:对于非空表插入记录时,MySQL会根据表的索引对插入记录建立索引。空表插入禁用是没有效果的

语法如下
#禁用索引
ALTER TABLE 表名 DISABLE KEYS;
#开启索引
ALTER TABLE 表名 ENABLE KEYS;
适用数据库引擎

MyISAM

非空表:禁用索引

–先清空student表数据

truncate student_my_isam ;

调用存储过程,先创建1万条数据。

CALL add_student_disable_index(10000) ;

【第31天】MYSQL进阶-写优化- 插入优化(SQL 小虚竹)_数据_03

禁用索引

ALTER TABLE student_my_isam DISABLE KEYS;

再调用存储过程,创建数据。

CALL add_student_disable_index(10000) ;

【第31天】MYSQL进阶-写优化- 插入优化(SQL 小虚竹)_sql_04


启用索引

ALTER TABLE student_my_isam ENABLE KEYS;
禁用唯一性检查

在插入大量数据时,可以先禁用唯一性检查,等数据插入完成,再启用唯一性检查。达到提高插入性能。

语法如下
#禁用唯一性检查
SET UNIQUE_CHECKS = 0;
#开启唯一性检查
SET UNIQUE_CHECKS = 1;
适用数据库引擎

MyISAM和InnoDB

禁用外键检查

在插入大量数据时,可以先禁用外键检查,等数据插入完成,再启用外键检查。达到提高插入性能。

语法如下
#禁用外键检查
SET foreign_key_checks = 0;
#开启外键检查
SET foreign_key_checks = 1;
适用数据库引擎

MyISAM和InnoDB

批量插入数据

向数据表中插入多条数据时,一次性插入多条比每次插入一条的性能要高出很多。

语法如下
INSERT INTO table_name (column1,column2,column3,…) 
VALUES (value1,value2,value3,…),(value4,value5,value6,…);
适用数据库引擎

MyISAM和InnoDB

批量导入数据

使用LOAD DATA INFILE导入数据比用INSERT插入数据的性能高。

语法如下
LOAD DATA INFILE ‘data_file_path’ INTO TABLE table_name;

说明:

  • data_file_path表示数据文件在服务器磁盘的绝对路径;
  • table_name表示数据表的名称

在使用LOAD DATA INFILE语句向InnoDB数据表批量导入数据时,被导入的文件中的数据记录最好是按照主键顺序排列的,这样可以提高导入数据的效率。

适用数据库引擎

MyISAM和InnoDB

禁用事务自动提交

InnoDB数据库引擎是支持事务的,可以先禁用事务自动提交,等数据插入完成,再启用事务自动提交。达到提高插入性能。

语法如下
#禁用事务自动提交
SET autocommit = 0;
#开启事务自动提交
SET autocommit = 1;
适用数据库引擎

InnoDB

三、总结

对于MylSAM引擎的表,常见的插入优化方法如下:

  • 禁用索引:对于非空表,插入记录时,MySQL会根据表的索引对插入的记录建立索引.如果插入大量数据,建立索引会降低插入记录的速度.为了解决这种情况可以在插入记录之前禁用索引,数据插入完毕后再开启索引。

对于空表批量导入数据,则不需要进行此操作,因为MylSAM引擎的表是在导入数据之后才建立索引的。

  • 禁用唯一性检查:插入数据时,MySQL会对插入的记录进行唯一性校验.这种唯一性校验也会降低插入记录的速度.为了降低这种情况对查询速度的影响,可以在插入记录之前禁用唯一性检查,等到记录插入完毕后再开启。
  • 批量插入数据:向数据表中插入多条数据时,一次性插入多条比每次插入一条的性能要高出很多。
  • 批量导入数据:使用LOAD DATA INFILE导入数据比用INSERT插入数据的性能高。

对于InnoDB引擎的表,常见的插入优化方法如下:

  • 禁用唯一性检查:插入数据时,MySQL会对插入的记录进行唯一性校验.这种唯一性校验也会降低插入记录的速度.为了降低这种情况对查询速度的影响,可以在插入记录之前禁用唯一性检查,等到记录插入完毕后再开启。
  • 禁用外键检查:插入数据之前执行禁止对外键的检查,数据插入完成之后再恢复对外键的检查。
  • 禁止事务自动提交:InnoDB数据库引擎是支持事务的,可以先禁用事务自动提交,等数据插入完成,再启用事务自动提交。达到提高插入性能。

所以,嗯,这题的答案选。。评论区大声告诉虚竹哥。

四、参考

MySQL进阶技能树–>写优化–>插入优化SQL快速入门-了解MySQL存储引擎(SQL 小虚竹)

我是虚竹哥,我们明天见~


标签:唯一性,数据,进阶,索引,禁用,插入,引擎,虚竹,优化
From: https://blog.51cto.com/u_14122613/6233913

相关文章

  • Kubernetes 1.3 从入门到进阶 安装篇:minikube
    Kubernetes单机运行环境一直是一个没有得到重视的问题。现在我们有了minikube,一个用go语言开发的可以在本地运行kubernetes的利器,不过目前应该只是支持kubernetes1.3。如果你只有一台机器或者虚拟机又想试验一下Kubernetes的新的功能,或者作kubernetes上开发的本地环境,minikube可能......
  • redis之持久化方案,主从复制,哨兵高可用,集群原理及搭建,缓存优化
    目录redis之持久化方案,主从复制,哨兵高可用,集群原理及搭建,缓存优化昨日内容回顾今日内容详细1持久化方案1.1RDB1.2aof方案1.3混合持久化2主从复制原理和方案3哨兵高可用4集群原理及搭建4.1集群搭建4.2集群扩容4.3集群缩容5缓存优化5.1redis缓存更新策略5.2缓存穿透击......
  • Jenkins java程序占用内存大 优化
       Linux系统下使用top命令,再输入M按钮,按照内存排序每个进程,发现jenkins占据内存过大,如下:   解决方式输入命令vim/etc/sysconfig/jenkins编辑jenkins文件,修改JENKINS_JAVA_OPTIONS属性:原来的属性如下: JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true"  ......
  • 垃圾回收机制,如何优化程序?GC
    垃圾回收是由jvm控制的,我们不能控制jvm进行垃圾回收  为了优化程序我们所能做的就是把我们不需要的资源处理成符合jvm垃圾回收条件  例如  Integer i=new Integer(88);  ...  //这时候我们不需要这个类了,我们希望jvm尽早进行垃圾回收,那么。。  ......
  • Day 28 28.2 JS进阶之eval和hook函数
    JS进阶之eval函数和hook函数【一】evaleval()函数计算JavaScript字符串,并把它作为脚本代码来执行。如果参数是一个表达式,eval()函数将执行表达式。如果参数是Javascript语句,eval()将执行Javascript语句。eval(string)//eval('[1,2,3,4,5].map(x=>x*x)')h......
  • Day 28 28.1 JS进阶之三元运算符
    JS工具之三元运算符【1】格式三元运算符:条件表达式?语句1:语句2;leta=10;letb=20;letd=a>b?a:bconsole.log(d);注释:条件运算符在执行时,首先对条件表达式进行求值,如果该值为true,则执行语句1,并返回执行结果如果该值为false,则......
  • 《Effective C#》系列之(五)——优化集合的使用
    一、优化集合的使用在《EffectiveC#》这本书中,优化集合的使用是其中一章的内容。以下是该章节的一些核心建议,以及使用C#代码示例说明:使用泛型集合:泛型集合可以避免装箱和拆箱操作,提高代码的性能和可读性。例如://使用泛型List集合varlist=newList<int>();list.Add(1);......
  • Day 27 27.2 JS进阶之window对象
    JS-Function对象之window对象window是客户端浏览器对象模型的基类,window对象是客户端JavaScript的全局对象。一个window对象实际上就是一个独立的窗口,对于框架页面来说,浏览器窗口每个框架都包含一个window对象。(1)全局作用域在客户端浏览器中,window对象是访问BOM......
  • Day 27 27.1 JS进阶-Function对象之prototype对象
    JS-Function对象之prorotype原型对象案例1://创建方式1varfoo=newFunction("console.log('helloworld!')")foo()//创建方式2functionPerson(){console.log("helloperson")}varp1=Person()console.log(p1)varp2=newPers......
  • Day 27 27.3 JS进阶之ES6新语法
    JS工具之三元运算符【1】格式三元运算符:条件表达式?语句1:语句2;leta=10;letb=20;letd=a>b?a:bconsole.log(d);注释:条件运算符在执行时,首先对条件表达式进行求值,如果该值为true,则执行语句1,并返回执行结果如果该值为false,则......