回城传送–》《100天精通MYSQL从入门到就业》
文章目录
- 零、前言
- 一、练习题目
- 二、SQL思路:SQL进阶-写优化-插入优化
- 解法
- 插入优化
- 禁用索引
- 语法如下
- 适用数据库引擎
- 非空表:禁用索引
- 禁用唯一性检查
- 语法如下
- 适用数据库引擎
- 禁用外键检查
- 语法如下
- 适用数据库引擎
- 批量插入数据
- 语法如下
- 适用数据库引擎
- 批量导入数据
- 语法如下
- 适用数据库引擎
- 禁用事务自动提交
- 语法如下
- 适用数据库引擎
- 三、总结
- 四、参考
零、前言
今天是学习 SQL 打卡的第 31 天,每天我会提供一篇文章供群成员阅读( 不需要订阅付钱 )。
希望大家先自己思考,如果实在没有想法,再看下面的解题思路,自己再实现一遍。在小虚竹JAVA社区 中对应的 【打卡贴】打卡,今天的任务就算完成了,养成每天学习打卡的好习惯。
虚竹哥会组织大家一起学习同一篇文章,所以有什么问题都可以在群里问,群里的小伙伴可以迅速地帮到你,一个人可以走得很快,一群人可以走得很远,有一起学习交流的战友,是多么幸运的事情。
我的学习策略很简单,题海策略+ 费曼学习法。如果能把这些题都认认真真自己实现一遍,那意味着 SQL 已经筑基成功了。后面的进阶学习,可以继续跟着我,一起走向架构师之路。
今天的学习内容是:SQL进阶-写优化- 插入优化
一、练习题目
题目链接 | 难度 |
SQL进阶-写优化- 插入优化 | ★★★☆☆ |
二、SQL思路:SQL进阶-写优化-插入优化
解法
要求处理:
- 从四个选项中选择一个正确答案
插入优化
往表中插入数据时,会受索引,唯一性校验,外键检查和事务自动提交等原因会影响插入的效率。以下会分别介绍各种优化的方式。
禁用索引
在(非空表)插入大量数据时,可以先禁用索引,等数据插入完成,再启用索引。达到提高插入性能。
注:对于非空表插入记录时,MySQL会根据表的索引对插入记录建立索引。空表插入禁用是没有效果的
语法如下
#禁用索引
ALTER TABLE 表名 DISABLE KEYS;
#开启索引
ALTER TABLE 表名 ENABLE KEYS;
适用数据库引擎
MyISAM
非空表:禁用索引
–先清空student表数据
truncate student_my_isam ;
调用存储过程,先创建1万条数据。
CALL add_student_disable_index(10000) ;
禁用索引
ALTER TABLE student_my_isam DISABLE KEYS;
再调用存储过程,创建数据。
CALL add_student_disable_index(10000) ;
启用索引
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 小虚竹)
我是虚竹哥,我们明天见~