MySQL进阶- SQL优化和视图

news2024/12/26 11:15:50

目录

  • SQL优化
    • 插入数据时的SQL优化(insert优化,和大批量数据插入)
    • 主键优化
    • order by优化(排序操作的优化)
    • group by优化(分组优化)
    • limit优化(分页查询优化)

SQL优化

插入数据时的SQL优化(insert优化,和大批量数据插入)

  • 批量插入
    在插入多条数据时,不要一句一句的SQL语句插入,而是一次性插入多条数据

    INSERT INTO 表名  (字段名1,字段名2...) VALUES (值一,值二,...),(值一,值二,...),(值一,值二,...);``
    INSERT INTO 表名 VALUES (值一,值二,...),(值一,值二,...),(值一,值二,...);``
    

    但是批量插入一次最多不要超过1000条,大概就是500到1000条,如果一次性要插入几万条数据,那么可以将其分为多条insert语句插入

  • 手动提交事务
    可以优化插入速度,在插入前手动开启事务,插入完成后手动结束事务

    start transaction;
    insert into 表名 values(具体数据1);
    insert into 表名 values(具体数据2);
    insert into 表名 values(具体数据3);
    ...
    commit;
    
  • 主键顺序插入
    在插入主键时按照主键的顺序插入
    在这里插入图片描述

  • 大批量插入数据
    如果一次性插入大批量数据(万级的),使用insert语句插入性能较低,此时可以使用MySQL提供的load指令插入,通过load指令可以将本地磁盘中的数据全部加载到数据库当中
    在这里插入图片描述
    使用load指令的步骤:
    1.在客户端连接服务端的时候,加上参数 – local-infile

    mysql--local-infile -u root -p
    

    2.设置全局参数local_infile为1,开启从本地加载文件导入数据的开关

    set global local infile=1;
    

    3.执行load指令将准备好的数据,加载到表结构中

    -- 这里的'/root/sql1.log'是本地文件
    -- fields teminated by ',':表示每一个字段之间使用 , 分割
    -- lines teminated by '\n';表示每一行数据之间使用 \n 分割
    load data local infile '本地文件' into table '表名' fields teminated by ',' lines teminated by '\n';
    

    在这里插入图片描述

    可以看到,默认情况下local_infile这个全局变量是关闭的
    在这里插入图片描述

    在这里插入图片描述
    注意这里插入数据时,由于是虚拟机,所以要现在finalshall中上传数据,把数据上传到虚拟机中
    在这里插入图片描述
    这里插入100万条数据只需要耗时16秒,很强

    使用load插入时也需要主键顺序插入,顺序插入数据高于乱序插入

    主键顺序插入性能高于乱序插入

主键优化

  • InnoDB中数据的组织方式:

    在InnoDB中,表的数据都是根据主键的顺序组织存放的,这种存储方式被称为索引组织表。(即每行数据在页中都是顺序存放)
    在这里插入图片描述
    page(页)是innoDB磁盘管理的最小单元,一个extent(区)中可以包含64个页

  • 页分裂
    页可以为空,也可以填充一半,也可以全部填满,但是一个页中最少包含2行数据,如果某行的数据较大,超出了页的阈值之后,就会出现行溢出的现象,

    如果顺序插入,就不会出现页分裂,乱序插入就会出现页分裂的现象,导致插入时要多操作页,自然插入的时间就会变长

  • 页删除
    在InnoDB中当删除一行数据时,实际上数据并没有被物理删除,而是数据被标记为删除并且他的空间变的允许其他数据使用

    在这里插入图片描述

    上图的13,14,15,16就是打上删除的标记了

    当页中删除的数据达到一个阈值(MERGE_THRESHOLD)时(默认为页的50%),innoDB会开始寻找最靠近的页(前或后面的页)看看是否可以将两个页进行合并以优化空间使用

    达到阈值在这里插入图片描述
    然后合并
    在这里插入图片描述
    再插入数据时就会往下一个页中插入数据
    这里阈值(MERGE_THRESHOLD)可以自己设置,默认为50%

  • 主键的设计原则
    满足业务需求的情况下,尽量降低主键的长度

插入数据时,尽量使用顺序插入,尽量使用auto_increment自增主键

尽量不要使用UUID做主键或者其他自然主键(如身份证号)

业务操作时,尽量避免对主键的修改

order by优化(排序操作的优化)

MySQL中的两种排序方式
在这里插入图片描述
using index的效率较高

-- 此时age和phone都没有索引,使用order by排序时都是Using filesort,效率较低
mysql> explain select id,age ,phone from tb_user_s1 order by age;
+----------------+
 | Extra          |
+----------------+
| Using filesort |
+----------------+
1 row in set, 1 warning (0.00 sec)

mysql> explain select id,age ,phone from tb_user_s1 order by age,phone;
+----------------+
 | Extra          |
+----------------+
| Using filesort |
-+----------------+
1 row in set, 1 warning (0.00 sec)

-- 为age和phone建立联合索引后,就会变为Using index

-- 若在查询时,order by之后的联合索引的排序不同,例如,一个顺序,一个倒序,
-- 也会出现Using filesort的情况
-- 这里age升序排列,phone倒序排列
select id,age ,phone from tb_user_s1 order by age asc,phone desc;

-- 这种情况的解决方式就是在创建联合索引时就把顺序定好
-- 下面就是在创建联合索引时就确定age和phone的排列方式
create index idx_user_age_phone_ad on tb_user_s1(age asc ,phone desc)

在这里插入图片描述
在这里插入图片描述

注意:上述的所有排序优化都有一个条件,就是覆盖索引,如果不是覆盖索引就不行

  • 即order by优化主要就以下几点:
  1. 根据排序字段建立合适的索引,多字段排序时,也遵循最左前缀法则
  2. 尽量使用覆盖索引
  3. 多字段排序,一个升序一个降序,此时需要注意联合索引在创建时的规则
  4. 如果不可避免的出现filesort,大数据量排序时,可以适当增大排序缓冲区大小sort_buffer_size(默认为256k)

group by优化(分组优化)

在分组操作时,建立适当的索引来提升效率
在这里插入图片描述
没有索引时,直接分组效率是较低的,使用索引对分组进行优化的话,就尽量使用联合索引,注意联合索引的最左前缀法则

在分组操作时,索引的使用也是需要满足最左前缀法则的

limit优化(分页查询优化)

limit一个常见的问题就是,在大数据量的情况下,越往后查询数据,limit的效率月底,例如limit 2000000,10,此时需要mysql排序前2000010记录,但是仅仅返回2000000和2000010之间的记录,其他的记录丢弃,查询排序的代价非常大

官方给出的优化方式是,通过覆盖索引和子查询的方式优化

-- 直接使用limit查询,效率很低,大概要19秒多
select *from tb_user_s2 limit 9000000,10;

-- 使用覆盖索引和子查询的方式优化
-- 先在子查询中找到对应的主键,然后再使用主键进行查询数据
-- 但是这种方式好像在mysql8.0.26语法不支持
select * from tb_user_s2 where id in(select id from tb_user_s2 order by in limit 9000000,10);

-- 那么可以使用另外的语法实现这个效果
-- 把select id from tb_user_s2 order by in limit 9000000,1
-- 返回的结果看成一张表,然后使用多表查询
select s.* from tb_user_s2 s, (select id from tb_user_s2 order by in limit 9000000,10) a where a.id=s.id;
-- 这样写大概查询是10秒,提高9秒的效率

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

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

相关文章

[RUST/腐蚀]Windows-开服服务端下载以及配置

一、前置要求 1.SteamCMD:SteamCMD - Valve Developer Communityhttps://developer.valvesoftware.com/wiki/SteamCMD 2.通过SteamCMD下载RUST/腐蚀服务端。 二、SteamCMD 注意:所有目录均应避免出现中文。 1.建立SteamCMD文件夹,如 D:\st…

准备入门python的一些建议

提醒:一下内容只代表个人观点 从18年左右开始,python的广告就被打得满天飞,网上各种吹嘘python这门语言的广告五花八门,当然也有一些人看完这些广告后感觉python非常的高大上,然后就入门学习了python,我就…

【测试基础02】

测试基础02 一、HTML基础二、Python导入三方模块三、安装webgrock驱动四、元素定位(1)、元素定位工具(2)、元素定位方式(3)、XPATH路径(3)、CSS选择器 五、Selenium WebDriver初步应用(1)、基本方法(2)、测试案例1(3)、测试案例2(3)、测试案例3 六、获取元素信息的方法七、fram…

价值5000元以上的某马大数据全套视频【强烈推荐】

某马大数据 01、阶段一 Python大数据开发基础 01、第一章大数据介绍及开发环境 02、第二章 linux命令 03、第三章 MySQL数据库 04、第四章 excel的使用 05、第五章 kettle的使用 06、第六章 数据分析及可视化 07、第七章 大数据框架与数仓基础 08、第八章 数仓实战项目 …

3-网络初识——协议

目录 1.概念 ①语法:即数据与控制信息的结构或格式。 ②语义:即需要发出何种控制信息,完成何种动作以及做出何种响应。 ③时序:即事件实现顺序的详细说明。 2.作用 3.知名协议的默认端口 4.协议分层 4.1.什么是协议分层 …

chatgpt赋能python:Python中的转置操作:理解与实践

Python中的转置操作:理解与实践 在Python中,可以使用转置操作来将矩阵或数组的行和列交换位置。转置操作不仅在数学和统计学上有广泛应用,也在机器学习和数据分析领域中非常重要。在本文中,我们将深入探讨Python中的转置操作的基…

C# | 使用Memory<T>高效地读写内存数据

C# | 使用Memory高效地读写内存数据 文章目录 C# | 使用Memory<T>高效地读写内存数据前言Memory<T>介绍示例结束语 前言 Memory<T>是C# 7.2版本中引入的一种新类型&#xff0c;可以更加高效地读写内存数据。本文将介绍它的用途以及如何使用它来优化代码。 P…

机器视觉康耐视智能相机Insight-手眼标定详细步骤

(Q有答疑)康耐视VisionPro工具与脚本入门级系列教程2023 In-Sight 智能相机包含标定手眼的工具 CalibrateGrid,用手动的标定方式,即将康耐视标定片固定在运动平台上,然后手动输入电机位置坐标,要保证电机在 X 方向移动一次,Y 方向移动一次,旋转两次角度,切旋转角度差不能…

chatgpt赋能python:Python中的绝对值函数

Python中的绝对值函数 在Python编程语言中&#xff0c;绝对值函数是一个非常重要和常用的函数。它可以帮助我们快速地计算一个数的绝对值&#xff0c;而不需要手动使用if语句来处理。在本文中&#xff0c;我们将介绍Python中的绝对值函数&#xff0c;并且讨论它的一些应用。 …

Linux 上安装 PostgreSQL——Ubuntu

打开 PostgreSQL 官网 PostgreSQL: The worlds most advanced open source database&#xff0c;点击菜单栏上的 Download &#xff0c;可以看到这里包含了很多平台的安装包&#xff0c;包括 Linux、Windows、Mac OS等 。 Linux 我们可以看到支持 Ubuntu 和 Red Hat 等各个平台…

ARC学习(1)基本编程模型认识

笔者有幸接触了arc处理器&#xff0c;今天就来简单了解一下arc的编程模型 1、ARC基本认识 ARC IP是synopsys 新思公司开发的一个系列ARC IP核&#xff0c;其是一家电子设计自动化&#xff08;EDA&#xff09;解决方案提供商。其主页地址在这里&#xff01;业务主要如下&#x…

chatgpt赋能python:Python中的按位取反

Python中的按位取反 Python中的按位取反是一种常见的操作&#xff0c;它可以让我们快速地对二进制的数字进行取反操作。在本文中&#xff0c;我们将介绍Python中的按位取反操作&#xff0c;并探讨它的用途和示例。 什么是按位取反 按位取反是一种将二进制数中的每一位进行反…

Vue之前后端交互模式

1. fetch-API的使用 1.1 init <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"…

手机常识汇总

目录 一、手机历史介绍 第一代模拟制式手机(1G) 什么是模拟网? 模拟网络与数字网络的区别 数字通信与模拟通信相比具有明显的优点: 第二代数字手机(2G) 什么是“GSM” 什么是 “CDMA”? GSM 数字机和模拟手机话音相比 什么是“GSM/CDMA 双模机”? 什么是“TDMA”…

FinChat.io,金融领域的chatgpt

投资股票是一个充满挑战的过程,随着市场的起起伏伏,要抓住每一个机会,同时规避各种风险,这需要投资者具有敏锐的洞察力和快速的决策能力。不过现在有好消息,一款人工智能聊天机器人 FinChat.io 诞生了!它能帮助投资者分析市场,挖掘有潜力的股票,并提供买卖的实时建议 --------…

Java与数据库:JDBC和ORM框架的使用和效率优化

第一章&#xff1a;引言 随着互联网的快速发展和大数据时代的到来&#xff0c;数据库在软件开发中起到了至关重要的作用。Java作为一门强大而广泛应用的编程语言&#xff0c;提供了多种与数据库交互的方式。其中&#xff0c;JDBC和ORM框架是最常用的两种方式。本文将深入探讨J…

OpenWRT 实现Exsi8单个公网ip管理与访问

一台Dell R720机器 内存256G(64G*4)硬盘SSD 8T(1T*8)搭建了一个裸金属k8s集群(对比阿里云单台4核8G的费用不相上下) 机房上架提供了一个公网ip 需要一个公网ip能实现exsi虚拟机管理 又可以让虚拟机实现web访问 是终通过OpenWRT实现 OpenWRT实现步骤 1、官网访问并下载img镜…

Kotlin笔记(零)简介

百度百科简介 2017年&#xff0c;google公司在官网上宣布Kotlin成为Android的开发语言&#xff0c;使编码效率大增。Kotlin 语言由 JetBrains 公司推出&#xff0c;这是一个面向JVM的新语言 参考资料 官网&#xff1a;https://kotlinlang.org/中文官网&#xff1a;https://w…

C++ 遍历算法

&#x1f914;遍历算法&#xff1a; &#x1f642;1.for_each 遍历容器 &#x1f50d;介绍&#xff1a; 在C中&#xff0c;for_each是一个用于遍历容器元素并对它们进行操作的算法。它通常有三个参数&#xff1a; &#x1f4d6;1. 容器的起始位置&#xff08;iterator&am…

chatgpt赋能python:Python中调换数据位置的方法

Python中调换数据位置的方法 在Python编程中&#xff0c;我们经常需要操作数据的位置&#xff0c;例如调换数组中的元素顺序、交换多个变量的值等。在本篇文章中&#xff0c;我们将介绍Python中调换数据位置的常用方法&#xff0c;并给出相应的代码示例。 1.使用临时变量交换…