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://xiahunao.cn/news/2868808.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Java-PriorityQueue源码分析

PriorityQueue 源码分析 Java中的PriorityQueue采用的是堆这种数据结构来实现的,而存储堆采用的则是数组。 堆是一个完全二叉树,堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值,对于每个节点的值都大于等于子树中每个节点值的堆,我们叫做大顶…

一学就会 | ChatGPT提示词-[简历指令库]-有爱AI实战教程(八)

演示站点: https://ai.uaai.cn 对话模块 官方论坛: www.jingyuai.com 京娱AI 一、导读: 在使用 ChatGPT 时,当你给的指令越精确,它的回答会越到位,举例来说,假如你要请它帮忙写文案&#xf…

SpringBoot打造企业级进销存储系统 第五讲

package com.java1234.repository;import com.java1234.entity.Menu; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query;import java.util.List;/*** 菜单Repository接口*/ public interface MenuReposit…

ISIS接口认证实验简述

默认情况下,ISIS接口认证通过在ISIS协议数据单元(PDU)中添加认证字段,例如:一个密钥或密码,用于验证发送方的身份。 ISIS接口认证防止未经授权的设备加入到网络中,并确保邻居之间的通信是可信的…

无限自动出兵-入门版【war3地图编辑器】

文章目录 1、创建单位和地区2、新事件开端3、动作3.1、创建单位3.2、选取单位3.2.1、发布指令 4、最终 1、创建单位和地区 2、新事件开端 创建新的触发器→新事件开端→时间→时间周期事件 3、动作 3.1、创建单位 3.2、选取单位 单位组→选取单位组内单位做动作 矩形区域内的…

数据结构:基于数组实现简单的数据缓存区(简单队列)

1 前言 在我们使用CAN或者以太网调试时,经常需要缓存最近n次收到的数据,以便于我们对数据进行分析。 实现这一想法我们很容易就会想到队列,队列就是一种先进先出的数据结构,之前在《数据结构:基于数组的环形队列&…

EtherCAT 开源主站 IGH 在 linux 开发板的移植和伺服通信测试

手边有一套正点原子linux开发板imax6ul,一直在吃灰,周末业余时间无聊,把EtherCAT的开源IGH主站移植到开发板上玩玩儿,搞点事情做。顺便学习研究下EtherCAT总线协议及其对伺服驱动器的运动控制过程。实验很有意思,这里总…

2核4G云服务器并发能支持多少用户在线?

腾讯云轻量2核4G5M带宽服务器支持多少人在线访问?5M带宽下载速度峰值可达640KB/秒,阿腾云以搭建网站为例,假设优化后平均大小为60KB,则5M带宽可支撑10个用户同时在1秒内打开网站,并发数为10,经阿腾云测试&a…

学点Java打小工_Day4_数组_冒泡排序

1 数组基本概念 程序算法数据结构 算法:解决程序的流程步骤 数据结构:将数据按照某种特定的结构来存储 设计良好的数据结构会导致良好的算法。 ArrayList、LinkedList 数组是最简单的数据结构。 数组:存放同一种类型数据的集合,在…

桌面待办,电脑桌面怎么设置待办事项

在忙碌的工作生活中,我们经常会有许多事情需要处理,为了提高工作效率和管理时间,很多人都有一套自己的桌面待办事项管理方法。那么,如何利用电脑桌面待办事项来提高工作效率,电脑桌面怎么设置待办事项呢? …

【Poi-tl Documentation】自定义占位符来设置图片大小

前置说明&#xff1a; <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.1</version> </dependency>模板文件&#xff1a; image_test.docx package run.siyuan.poi.tl.policy;imp…

Internet协议的安全性

Internet协议的安全性 文章目录 Internet协议的安全性1. 网络层1. IP*62. ARP*33. ICMP * 3 2. 传输层协议1. TCP1. * SYN-Flood攻击攻击检测* 防御 2. TCP序号攻击攻击 3. 拥塞机制攻击 2. UDP 3. 应用层协议1. DNS攻击*3防范*3: 2. FTP3. TELNET: 改用ssh4. 电子邮件1. 攻击2…

set与zset数据类型

set类型基础 redis集合(set)类型和list列表类型类似&#xff0c;都可以用来存储多个字符串元素的 集合。但是和list不同的是set集合当中不允许重复的元素。而且set集合当中元素是没有顺序的&#xff0c;不存在元素下标。 redis的set类型是使用哈希表构造的&#xff0c;因此复…

每日OJ题_简单多问题dp⑥_力扣714. 买卖股票的最佳时机含手续费

目录 力扣714. 买卖股票的最佳时机含手续费 状态机分析 解析代码 力扣714. 买卖股票的最佳时机含手续费 714. 买卖股票的最佳时机含手续费 难度 中等 给定一个整数数组 prices&#xff0c;其中 prices[i]表示第 i 天的股票价格 &#xff1b;整数 fee 代表了交易股票的手续…

Linux远程连接本地数据库(docker)

1. 安装docker 参考上一篇文章 CentOS安装Docker 2. Linux中安装Mysql 2.1 docker拉取mysql镜像 拉取镜像 docker pull mysql查看镜像列表 docker images2.2 运行mysql容器 运行一个名字为mysql的mysql容器&#xff0c;其连接端口号为3306&#xff0c;密码为123456 docker r…

口腔管理平台 |基于springboot框架+ Mysql+Java+B/S结构的口腔管理平台 设计与实现(可运行源码+数据库+lw文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 管理员功能登录前台功能效果图 会员功能 系统功能设计 数据库E-R图设计 lunwen参考…

RT-Thread之USB组件的使用记录(SD卡和USB同时挂载)

前言 使用usb-host组件读取u盘记录同时挂载sd和u盘用到的芯片为stm32f407zgt6u盘的格式为fat 组件选择 文件相关的宏定义 /* DFS: device virtual file system */ /* 设备虚拟文件系统 */ #define RT_USING_DFS #define DFS_USING_WORKDIR #define DFS_FILESYSTEMS_MAX 3 //…

Pikachu 靶场搭建

文章目录 环境说明1 Pikachu 简介2 Pikachu 安装 环境说明 操作系统&#xff1a;Windows 10PHPStudy 版本: 8.1.1.3Apache 版本&#xff1a;2.4.39MySQL 版本 5.7.26 1 Pikachu 简介 Pikachu是一个使用“PHP MySQL” 开发、包含常见的Web安全漏洞、适合Web渗透测试学习人员练…

印度交易所股票行情数据API接口

1. 历史日线 # Restful API https://tsanghi.com/api/fin/stock/XNSE/daily?token{token}&ticker{ticker}默认返回全部历史数据&#xff0c;也可以使用参数start_date和end_date选择特定时间段。 更新时间&#xff1a;收盘后3~4小时。 更新周期&#xff1a;每天。 请求方式…

python二级备考(3)-综合应用

1 《命运》是著名科幻作家倪匡的作品。这里给出《命运》的一个网络版本文件&#xff0c;文件名为“命运. txt”。 问题1 (5分) :在PY301-1. py文件中修改代码&#xff0c;对“命运. txt”文件进行字符频次统计&#xff0c;输出频次最高的中文字符(不包含标点符号)及其频次&…