回城传送–》《31天SQL筑基》
今天是学习 SQL 打卡的第 31 天,每天我会提供一篇文章供群成员阅读( 不需要订阅付钱 )。
希望大家先自己思考,如果实在没有想法,再看下面的解题思路,自己再实现一遍。在小虚竹JAVA社区 中对应的 【打卡贴】打卡,今天的任务就算完成了,养成每天学习打卡的好习惯。
虚竹哥会组织大家一起学习同一篇文章,所以有什么问题都可以在群里问,群里的小伙伴可以迅速地帮到你,一个人可以走得很快,一群人可以走得很远,有一起学习交流的战友,是多么幸运的事情。
我的学习策略很简单,题海策略+ 费曼学习法。如果能把这些题都认认真真自己实现一遍,那意味着 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;
说明:
在使用LOAD DATA INFILE语句向InnoDB数据表批量导入数据时,被导入的文件中的数据记录最好是按照主键顺序排列的,这样可以提高导入数据的效率。
MyISAM和InnoDB
InnoDB数据库引擎是支持事务的,可以先禁用事务自动提交,等数据插入完成,再启用事务自动提交。达到提高插入性能。
#禁用事务自动提交
SET autocommit = 0;
#开启事务自动提交
SET autocommit = 1;
InnoDB
对于MylSAM引擎的表,常见的插入优化方法如下:
对于空表批量导入数据,则不需要进行此操作,因为MylSAM引擎的表是在导入数据之后才建立索引的。
对于InnoDB引擎的表,常见的插入优化方法如下:
所以,嗯,这题的答案选。。评论区大声告诉虚竹哥。
MySQL进阶技能树–>写优化–>插入优化
SQL快速入门-了解MySQL存储引擎(SQL 小虚竹)
我是虚竹哥,我们明天见~