MySQL:SQL优化

1. 插入优化

使用insert语句单条单条数据插入效率偏低,建议使用insert批量插入数据,批量控制在500-1000条数据较为合适,当面对数以百万的数据时,可以使用load指令,提升插入数据效率 

相关指令 

 #客户端连接服务端加上参数 --local-infile 

mysql --local-infile -u -root -p;

#设置全局参数,将local_infile设置为1,即开启从本地导入数据的开关

set global local_infile =  1;

#执行load指令,将数据加载进表中

load data local infile '文件路径‘ into table '加载相对应表的名称‘ fields terminated by '以什么形式进行分割表格里面的每一行数据' lines terminated by '每一行最后以什么形式结尾'

加载数以百万数据的指令需要先以该指令登录数据库才能执行相对应指令
mysql --local-infile -u root -pmysql> #创建sb数据库
mysql> create database sb;
Query OK, 1 row affected (0.01 sec)mysql> #展示当前数据库
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sb                 |
| sys                |
+--------------------+
5 rows in set (0.01 sec)mysql> #查看批量添加脚本开关是否开启,默认关闭开关
mysql> select @@local_infile;
+----------------+
| @@local_infile |
+----------------+
|              0 |
+----------------+
1 row in set (0.00 sec)mysql> #开添加脚本数据开关
mysql> set global local_infile = 1;
Query OK, 0 rows affected (0.03 sec)mysql> select @@local_infile;
+----------------+
| @@local_infile |
+----------------+
|              1 |
+----------------+
1 row in set (0.00 sec)mysql> use sb;
Database changed
mysql> 
mysql> #执行脚本,将数据添加到要添加的数据库
mysql> CREATE TABLE `tb_user` (->   `id` INT(11) NOT NULL AUTO_INCREMENT,->   `username` VARCHAR(50) NOT NULL,->   `password` VARCHAR(50) NOT NULL,->   `name` VARCHAR(20) NOT NULL,->   `birthday` DATE DEFAULT NULL,->   `sex` CHAR(1) DEFAULT NULL,->   PRIMARY KEY (`id`),->   UNIQUE KEY `unique_user_username` (`username`)-> ) ENGINE=INNODB DEFAULT CHARSET=utf8 ;
Query OK, 0 rows affected, 2 warnings (0.11 sec)mysql> #将文本数据加载进sb数据库中的tb_user表中
mysql> load data local infile '/root/load_user_100w_sort.sql' into table tb_user fields terminated by ',' lines terminated by '\n';
Query OK, 1000000 rows affected (1 min 18.07 sec)
Records: 1000000  Deleted: 0  Skipped: 0  Warnings: 0mysql> select count(*) from tb_user;
+----------+
| count(*) |
+----------+
|  1000000 |
+----------+
1 row in set (0.98 sec)

2. 主键优化

磁盘空间图

主键的乱序插入和删除会引起两个现象:页分裂和页合并

页:可以为空,也可以已存储50%、66%、100%等待空间,页和页之间有个指针进行联通

页分裂: 当两个页面已经填满数据,但是又有新的数据要插入到两个页面之间时会发生页分裂现象,此时会新建一个页,将第一个页面的50%的数据和新数据一起存入新页面中,而那移动的50%的数据原来所占的空间将会被标记为空,即可以有数据存入该位置,最后页面的之间的指针连接调整,保证数据存储的顺序。

页合并:当一个页面的数据被删除到一定程序时(50%)那么该页会在前后两个页面查找,看两个页面是否有合并的可能,如果有则两个页面数据进行合并 

 

主键设计原则:

  1. 主键长度尽量不要过长
  2. 主键尽量顺序插入
  3. 尽量减少主键的修改操作,主键修改需重新调整存储顺序 

3. Order by优化 

mysql> explain select age, phone from tb_user order by age asc, phone desc;
+----+-------------+---------+------------+-------+---------------+------------------+---------+------+------+----------+-----------------------------+
| id | select_type | table   | partitions | type  | possible_keys | key              | key_len | ref  | rows | filtered | Extra                       |
+----+-------------+---------+------------+-------+---------------+------------------+---------+------+------+----------+-----------------------------+
|  1 | SIMPLE      | tb_user | NULL       | index | NULL          | idx_user_age_pho | 48      | NULL |   21 |   100.00 | Using index; Using filesort |
+----+-------------+---------+------------+-------+---------------+------------------+---------+------+------+----------+-----------------------------+
1 row in set, 1 warning (0.00 sec)#此时不通过索引直接返回,效率相对较差#建立索引
mysql> create index idx_user_age_pho_ad on tb_user(age asc, phone desc);
Query OK, 0 rows affected (0.49 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> explain select age, phone from tb_user order by age asc, phone desc;
+----+-------------+---------+------------+-------+---------------+---------------------+---------+------+------+----------+-------------+
| id | select_type | table   | partitions | type  | possible_keys | key                 | key_len | ref  | rows | filtered | Extra       |
+----+-------------+---------+------------+-------+---------------+---------------------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | tb_user | NULL       | index | NULL          | idx_user_age_pho_ad | 48      | NULL |   21 |   100.00 | Using index |
+----+-------------+---------+------------+-------+---------------+---------------------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.10 sec)

 

4. Group by优化 

当extra查询结果显示有using temporary时(使用临时表)查询分组效率相对较低的 ,此时应当建立索引提高分组效率,当extra结果为using index即走了索引,分组效率相对临时大幅提高

mysql> explain select profession, count(*) from tb_user group by profession;
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-----------------+
| id | select_type | table   | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra           |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-----------------+
|  1 | SIMPLE      | tb_user | NULL       | ALL  | NULL          | NULL | NULL    | NULL |   21 |   100.00 | Using temporary |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-----------------+
1 row in set, 1 warning (0.00 sec)#建立索引后分组效率提高
mysql> explain select profession, count(*) from tb_user group by profession;
+----+-------------+---------+------------+-------+----------------------+----------------------+---------+------+------+----------+-------------+
| id | select_type | table   | partitions | type  | possible_keys        | key                  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+---------+------------+-------+----------------------+----------------------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | tb_user | NULL       | index | idx_user_pro_age_sta | idx_user_pro_age_sta | 54      | NULL |   21 |   100.00 | Using index |
+----+-------------+---------+------------+-------+----------------------+----------------------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.01 sec)

 5. limit优化

当进行分页查询时越往后查询时间相对越长,此时可以通过覆盖索引+子查询的方式提高分页查询效率

 6. count优化

innodb引擎中统计总行数是将数据从磁盘中逐行读出进行统计的,统计效率低

优化思路:定义变量自己统计 

 

7. update优化

innodb引擎针对索引加的锁,不是针对数据加的锁

不通过主键/索引更新数据容易发生行锁升级为表锁的事件, 一旦升级为表锁,并发性能将会降低

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/545023.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

哔哩哔哩后端Java一面

前言 作者:晓宜 个人简介:互联网大厂Java准入职,阿里云专家博主,csdn后端优质创作者,算法爱好者 最近各大公司的春招和实习招聘都开始了,这里分享下去年面试B站的的一些问题,希望对大家有所帮助…

稀碎从零算法笔记Day19-LeetCode:相交链表

题型:链表基本操作 链接:160. 相交链表 - 力扣(LeetCode) 来源:LeetCode 题目描述 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&…

AI - 支持向量机算法

🧨概念 支持向量机(Support Vector Machine, SVM)是一种强大的机器学习算法,主要用于解决二分类问题。 SVM的核心思想是找到一个超平面,这个超平面能够最好地将数据分为两类,即在保证分类准确的情况下&am…

AcWing 2. 01背包问题

题目描述 解题思路: 相关代码: import java.util.Scanner; public class Main {public static void main(String[] args){Scanner scanner new Scanner(System.in);/** 背包问题的物品下标最好从1开始。* *//*定义一f[i][j]数组,i表示的…

Go——运算符,变量和常量,基本类型

一.运算符 Go语言内置的运算符有: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 1.1 算术运算符 注意:(自增)和--(自减)在go语言中是单独的语句,并不是运算符。 1.2 关系运算符 1.3 逻辑运算符 1.4 位运算符 位运算符对整数在内存…

202206青少年软件编程(图形化) 等级考试试卷(二级)

青少年软件编程(图形化) 等级考试试卷(二级)2022年6月 第1题:【 单选题】 角色初始位置如图所示,下面哪个选项能让角色移到舞台的左下角? ( ) A: B: C: D: 【正确答案】: C 【试题解析】 : 舞台的左下角, 坐标 x 为负数, 坐标 y 为负数, 故应该使用移…

在pzp203上运行ad9361 no-os工程

0. 环境 - pzp203 - ubuntu18 vivado2018 pzp203是一款plutosdr的国产兼容版。出厂默认是基于linux系统的,用libiio调用。软硬件兼容adalm-pluto。开发板提供网盘资料,是添加了板卡适配的。 1. hdl 1.1 准备源码 hdl https://github.com/analogdevi…

白话模电:3.三极管(考研面试与笔试常考问题)

一、三极管的简单判断 1.判断三极 1)给了图 左边是b,有箭头是e,剩下是c 2)给了电位 b:中间值,e:较近值(离中间值),c:较远值(离中间值) 2.判断流向 bc同向(共同流向“|”或共同流离“|”),e与bc反向 3.判断材料 4.判断类型 5.判断能否构…

15 顶级的免费 SD 卡恢复软件来恢复丢失的数据

查看顶级 SD 卡恢复软件。比较功能并选择最好的免费或付费存储卡数据恢复软件: SD 卡是一种方便的小硬件,可用于存储数据。了解这些设备在首次推出几十年后仍然如此受欢迎是一件很有趣的事情。尽管我们可以使用其他可以说是更好的替代品,但它…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:TextPicker)

滑动选择文本内容的组件。 说明: 该组件从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 子组件 无 接口 TextPicker(options?: {range: string[] | string[][] | Resource | TextPickerRangeContent[] | Te…

python副业兼职手段有哪些

经过多年的总结,鄙人发现python是最适合做兼职副业的编程语言,无论是国内还是国外,对python的需求非常大,python简直就是万能语言。Python副业兼职手段有以下几种: 兼职处理数据:Excel整理数据功能虽然很强…

C#,动态规划问题中基于单词搜索树(Trie Tree)的单词断句分词( Word Breaker)算法与源代码

1 分词 分词是自然语言处理的基础,分词准确度直接决定了后面的词性标注、句法分析、词向量以及文本分析的质量。英文语句使用空格将单词进行分隔,除了某些特定词,如how many,New York等外,大部分情况下不需要考虑分词问题。但有些情况下,没有空格,则需要好的分词算法。…