当前位置: 首页 > news >正文

MySQL数据库6——SQL优化

一.SQL优化

1.插入优化

  • 优化1:批量插入

    insert into 表名 values(记录1),(记录2),……;
    
  • 优化2:手动提交事务

    start transaction;
    insert into 表名 values(记录1),(记录2);
    insert into 表名 values(记录1),(记录2);
    ……
    commit;
    
  • 优化3:主键顺序插入

    #客户端连接服务端时,加上参数 --local-infile
    mysql --local-infile -u root -p
    #设置全局参数local_infile为1,开启从本地加载文件导入数据的开关
    set global local_infile=1;
    #执行load指令将准备好的数据,加载到表结构中
    load data local infile '.sql数据库文件路径' into '表名' fields terminated by ',' lines terminated by '\n';
    

2.主键优化

页分裂:

  • 页可以为空,也可以填充一半,也可以填充100%
  • 主键顺序插入
  • 如果某一行数据较多,再插入会发生数据溢出,会产生新的页进而移动一办再插入,产生页分裂

页合并:

  • 当删除一行记录时,实际上记录并没有被物理删除,只是记录被标记(flaged)为删除并且它的空间变得允许被其他记录声明使用

  • 当页中删除的记录达到 MERGE_THRESHOLD(默认为页的50%),innoDB会开始寻找最靠近的页(前或后)看看是否可以将两个页合并以优化空间使用。

主键设计原则:

  • 满足业务需求的情况下,尽量降低主键的长度。
  • 插入数据时,尽量选择顺序插入,选择使用AUTO INCREMENT自增主键
  • 尽量不要使用UUID(Java中随机数函数)做主键或者是其他自然主键,如身份证号
  • 业务操作时,避免对主键的修改。

3.order by优化

MySQL两种排序逻辑方式:

  • Using filesort:通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区sort buffer中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫 FileSot排序
  • Using index:通过有序索引顺序扫描直接返回有序数据,这种情况即为using index,不需要额外排序,操作效率高。

创建索引时,系统默认是按字段升序建立索引结构,但你可以指定排序方式

当使用order by排序时存在对应的索引结构,那么extra对应的额外信息应该是using index

这里的前提是覆盖查询,即查询信息满足在一个二级索引结构里面而不需要回表查询

4.group by优化

  • 在分组操作时,可以通过索引来提高效率
  • 分组操作时,索引的使用也是满足最左前缀法则的

5.limit优化

常见又非常头疼的问题就是limit 2000000,10,此时需要MySQL排序前2000010 记录,仅仅返回2000000-2000010的记录,其他记录丢弃,查询排序的代价非常大。
优化思路:一般分页查询时,通过创建覆盖索引 能够比较好地提高性能,可以通过覆盖索引加子查询形式进行优化。

6.count优化

  • MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行count(*)的时候会直接返回这个数,效率很高
  • InnoDB引擎就麻烦了,它执行count()的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数

count的几种用法:

  • count(主键)innoDB引擎会遍历整张表,把每一行的主键id 值都取出来,返回给服务层。服务层拿到主键后,直接按行进行累加(主键不可能为null)。
  • count (字段):
    • 没有not null约束:InnoDB 引会遍历整张表把每一行的字段值都取出来,返回给服务层,服务层判断是否为null,不为null,计数累加
    • not null 约束: InnoDB引擎会遍历整张表把每一行的字段值都取出来,返回给服务层,直接按行进行累加。
  • count (1)InnoDB 引擎遍历整张表,但不取值。服务层对于返回的每一行,放一个数字“1”进去,直接按行进行累加
  • count (*)innoDB引擎并不会把全部字段取出来,而是专门做了优化,不取值,服务层直接按行进行累加。

按照效率排序的话,count(字段)< count(主键id)< count(1)= count*),所以尽量使用 count(*)

7.update优化

innoDB三大特性:事务、外键、行级锁。

InnoDB的行锁是针对索引加的锁,不是针对记录加的锁,并且该索引不能失效,否则会从行锁升级为表锁

二.视图

1.视图语法

视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。通俗的讲,视图只保存了查询的SOL逻辑,不保存查询结果。所以我们在创建视图的时候,主要的工作就落在创建这条SOL查询语句上。

创建视图:

CREATE [OR REPLACE] VIEW 视图名称[(列名列表)] AS SELECT语句 [WITH [CASCADED|LOCAL] CHECK OPTION];
  • 如果创建是新视图,替换旧视图,加上[OR REPLACE]选项
  • SELECT语句中的查询表叫基表

查看视图:

SHOW CREATE VIEW 视图名称;                 #查看创建视图的语句
SELECT * FROM 视图名称……;                  #查看视图数据
  • 视图是一张虚拟存在的表,可以向操作表一样操作视图

修改视图:

CREATE OR REPLACE VIEW 视图名称[(列名列表)] AS SELECT语句 [WITH [CASCADED|LOCAL] CHECK OPTION];   #方式一
ALTER VIEW 视图名称[(列名列表)] AS SELECT语句 [WITH [CASCADED|LOCAL] CHECK OPTION];               #方式二
  • 方式一类似于创造时的覆盖重写

删除视图:

DROP VIEW [IF EXISTS] 视图名称[(列名列表)];

2.检查选项(cascaded)

视图理解(暂时):视图相当于从基表中分离出来的一个虚拟子表,可以对视图进行增删改查操作,就等于对这个虚拟子表进行增删改查等操作,但是由于基表和子表数据的一致性,子表的增删改查一定会引起基表的操作,但是子表是受限的基表数据,对视图进行操作时需要检查是否受限,所以有检查选项

当使用WITH CHECK OPTION子句创建视图时,MySQL会通过视图检查正在更改的每个行,例如 插入、更新、删除,以使其符合视图的定
义。MySQL允许基于另一个视图创建视图,它还会检查依赖视图中的规则以保持一致性。为了确定检查的范围,mysql提供了两个选项:CASCADED LOCAL,默认值为 CASCADED

CASCADED翻译是级联,他代表要向上满足各级依赖的条件,无论上级依赖是否定义检查选项。

3.检查选项(local)

LOCAL选项,也需要向上递归判断是否满足依赖的条件,但是如果某一级依赖没有定义检查选项,则该级依赖的条件无效。

4.更新及作用

要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。如果视图包含以下任何一项,则该视图不可更新:

  • 1.聚合函数或窗口函数 (SUM()、MIN()、MAX()、COUNT()等)
  • 2.DISTINCT
  • 3.GROUP BY
  • 4.HAVING
  • 5.UNION 或者 UNION ALL

作用:

  • 简单:视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件。
  • 安全:数据库可以授权,但不能授权到数据库特定行和特定的列上。通过视图用户只能查询和修改他们所能见到的数据
  • 数据独立:视图可帮助用户屏蔽真实表结构变化带来的影响。

5.案例

-- 1. 为了保证数据库表的安全性,开发人员在操作tb_user表时,只能看到的用户的基本字段,屏蔽手机号和邮箱两个字段。
create view tb_user_view as select id,name,profession,age,gender,status,createtime from tb_user;select * from tb_user_view;-- 2. 查询每个学生所选修的课程(三张表联查),这个功能在很多的业务中都有使用到,为了简化操作,定义一个视图。create view tb_stu_course_view as select s.name student_name , s.no student_no , c.name course_name from student s, student_course sc , course c where s.id = sc.studentid and sc.courseid = c.id;select * from tb_stu_course_view;

相关文章:

MySQL数据库6——SQL优化

一.SQL优化 1.插入优化 优化1&#xff1a;批量插入 insert into 表名 values(记录1),(记录2),……;优化2&#xff1a;手动提交事务 start transaction; insert into 表名 values(记录1),(记录2); insert into 表名 values(记录1),(记录2); …… commit;优化3&#xff1a;主键顺…...

IDEA配置本地maven

因为idea和maven是没有直接关系的。所以使用idea创建maven工程之前需要将本地的maven配置到idea环境中&#xff0c;这样才可以在idea中创建maven工程。配置方法如下&#xff1a; 1.1 配置本地maven 第一步&#xff1a;关闭当前工程&#xff0c;回到idea主界面找到customize--…...

学习日记_20241123_聚类方法(高斯混合模型)续

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…...

SpringMVC——简介及入门

SpringMVC简介 看到SpringMVC这个名字&#xff0c;我们会发现其中包含Spring&#xff0c;那么SpringMVC和Spring之间有怎样的关系呢&#xff1f; SpringMVC隶属于Spring&#xff0c;是Spring技术中的一部分。 那么SpringMVC是用来做什么的呢&#xff1f; 回想web阶段&#x…...

文件操作完成后,为什么要关闭文件

原因包括&#xff1a; 释放系统资源&#xff1a;打开文件时&#xff0c;操作系统会分配资源&#xff0c;如文件描述符或句柄&#xff0c;用于管理文件访问。如果文件保持打开状态&#xff0c;这些资源就不会被释放&#xff0c;可能导致资源耗尽。 确保数据完整性&#xff1a;写…...

vue3+echarts+ant design vue实现进度环形图

1、代码 <div> <!-- 目标环形图 --><div id"main" class"chart_box"> </div><div class"text_target">目标</div> </div>// 目标环形图 const onEcharts () > {// 基于准备好的dom&#xff0c;初…...

使用argo workflow 实现springboot 项目的CI、CD

文章目录 基础镜像制作基础镜像设置镜像源并安装工具git下载和安装 Maven设置环境变量设置工作目录默认命令最终dockerfile 制作ci argo workflow 模版volumeClaimTemplatestemplatesvolumes完整workflow文件 制作cd argo workflow 模版Workflow 结构Templates 定义创建 Kubern…...

C++知识点总结(58):序列型动态规划

动态规划Ⅰ 一、基础1. 意义2. 序列 dp 解法 二、例题1. 最大子段和2. 删数最大子段和&#xff08;数据强度&#xff1a;pro max&#xff09;3. 最长上升子序列&#xff08;数据强度&#xff1a;pro max&#xff09;4. 3 或 5 的倍数序列5. 数码约数序列 一、基础 1. 意义 动…...

go interface(接口)使用

在 Go 语言中&#xff0c;接口&#xff08;interface&#xff09;是一种抽象类型&#xff0c;它定义了一组方法&#xff0c;但是不实现这些方法。接口指定了一个对象的行为&#xff0c;而不关心对象的具体实现。接口使得代码更加灵活和可扩展。 定义接口 接口使用 type 关键字…...

【docker】docker commit 命令 将当前容器的状态保存为一个新的镜像

在Docker容器中安装了许多软件&#xff0c;并希望将当前容器的状态保存为一个新的镜像&#xff0c;可以使用docker commit命令来创建一个新的镜像。以下是如何操作的步骤&#xff1a; 找到容器ID或名称&#xff1a; 首先&#xff0c;需要找到想要保存的容器的ID或名称。可以使用…...

使用 Java 中的 `String.format` 方法格式化字符串

前言 在编程过程中&#xff0c;我们经常需要创建格式化的字符串来满足特定的需求&#xff0c;比如生成用户友好的消息、构建报告或是输出调试信息。Java 提供了一个强大的工具——String.format 方法&#xff0c;它可以帮助我们轻松地完成这些任务。 String.format 方法简介 …...

图论最短路(floyed+ford)

Floyd 算法简介 Floyd 算法&#xff08;也称为 Floyd-Warshall 算法&#xff09;是一种动态规划算法&#xff0c;用于解决所有节点对之间的最短路径问题。它可以同时处理加权有向图和无向图&#xff0c;包括存在负权边的情况&#xff08;只要没有负权环&#xff09;。 核心思…...

BERT的中文问答系统39

实现当用户在GUI中输入问题&#xff08;例如“刘邦”&#xff09;且输出的答案被标记为不正确时&#xff0c;自动从百度百科中搜索相关内容并显示在GUI中的功能&#xff0c;我们需要对现有的代码进行一些修改。以下是完整的代码&#xff0c;包括对XihuaChatbotGUI类的修改以及新…...

从 Mac 远程控制 Windows:一站式配置与实践指南20241123

引言&#xff1a;跨平台操作的需求与挑战 随着办公场景的多样化&#xff0c;跨平台操作成为现代开发者和 IT 人员的刚需。从 Mac 系统远程控制 Windows&#xff0c;尤其是在同一局域网下&#xff0c;是一种高效解决方案。不仅能够灵活管理资源&#xff0c;还可以通过命令行简化…...

【Linux学习】【Ubuntu入门】1-5 ubuntu软件安装

1.使用sudo apt-get install vim&#xff1a;安装vim编辑器。 参考安装 安装时可能会遇到的问题 2.deb软件安装命令sudo dpkg -i xxx.deb 下载软件安装包时下载Linux版本&#xff0c;在Ubuntu中双击deb文件或者输入命令sudo dpkg -i xxx.deb&#xff0c;xxx.deb为安装包名称…...

如何自动下载和更新冰狐智能辅助?

冰狐智能辅助的版本更新非常快&#xff0c;如果设备多的话每次手工更新会非常麻烦&#xff0c;现在分享一种免费的自动下载和安装冰狐智能辅助的方法。 一、安装迅雷浏览器 安装迅雷浏览器1.19.0.4280版本&#xff0c;浏览器用于打开冰狐的官网&#xff0c;以便于从官网下载a…...

动态渲染页面爬取

我们可以直接使用模拟浏览器运行的方式来实现&#xff0c;这样就可以做到在浏览器中看到是什么样&#xff0c;抓取的源码就是什么样&#xff0c;也就是可见即可爬。这样我们就不用再去管网页内部的 JavaScript 用了什么算法渲染页面&#xff0c;不用管网页后台的 Ajax 接口到底…...

C++适配器模式之可插入适配器的实现模式和方法

可插入适配器与Adaptee的窄接口 在C适配器模式中&#xff0c;可插入适配器&#xff08;Pluggable Adapter&#xff09;是指适配器类的设计允许在运行时动态地插入不同的Adaptee对象&#xff0c;从而使适配器具有灵活性和可扩展性。这种设计使得适配器不仅限于适配一个特定的Ad…...

每日一练:【动态规划算法】斐波那契数列模型之第 N 个泰波那契数(easy)

1. 第 N 个泰波那契数&#xff08;easy&#xff09; 1. 题目链接&#xff1a;1137. 第 N 个泰波那契数 2. 题目描述 3.题目分析 这题我们要求第n个泰波那契Tn的值&#xff0c;很明显的使用动态规划算法。 4.动态规划算法流程 1. 状态表示&#xff1a; 根据题目的要求及公…...

Hash table类算法【leetcode】

哈希表中关键码就是数组的索引下标&#xff0c;然后通过下标直接访问数组中的元素 那么哈希表能解决什么问题呢&#xff0c;一般哈希表都是用来快速判断一个元素是否出现集合里。 例如要查询一个名字是否在这所学校里。 要枚举的话时间复杂度是O(n)&#xff0c;但如果使用哈希…...

windows实现VNC连接ubuntu22.04服务器

最近弄了一个700块钱的mini主机&#xff0c;刷了ubuntu22.04系统&#xff0c;然后想要在笔记本上通过VNC连接&#xff0c;这样就有了一个linux的开发环境。最后实现的过程为&#xff1a; 安装vnc服务器 安装 VNC 服务器软件&#xff1a; sudo apt update sudo apt install t…...

中国电信星辰大模型:软件工厂与文生视频技术的深度解析

在科技日新月异的今天,人工智能(AI)技术正以惊人的速度改变着我们的生活和工作方式。作为这一领域的领军企业之一,中国电信凭借其强大的研发实力和深厚的技术积累,推出了星辰大模型,旨在为用户带来更加智能、高效、便捷的服务体验。本文将重点介绍中国电信星辰大模型中的…...

项目实战:基于Vue3实现一个小相册

相册的示例效果图 注意看注释... 要实现图片的相册效果&#xff0c;图片命名可以像{img1.jpg,img2.jpg,img3.jpg}类似于这种的命名方式。 CSS部分&#xff1a; <style>/* 伪元素选择器&#xff0c;用于在具有clear_ele类的元素内部的末尾添加一个新的元素 */.clear_ele:…...

macOS安装nvm node

macOS安装nvm macOS安装nvm创建 nvm 工作目录配置环境变量使用 nvm查看可用的 Node.js 版本安装特定版本 macOS安装nvm brew install nvm创建 nvm 工作目录 mkdir ~/.nvm配置环境变量 vim ~/.zshrc# nvm export NVM_DIR"$HOME/.nvm" [ -s "/opt/homebrew/opt…...

解决整合Django与Jinja2兼容性的问题

提问 解决整合Django与Jinja2时遇到了一些兼容性问题。已经按照常规步骤在我的settings.py中配置了Jinja2作为模板引擎&#xff0c;同时保留了Django默认的模板设置。然而尝试同时使用Django和Jinja2时&#xff0c;系统报错提示我没有指定模板。如果我尝试移除Django的默认模板…...

Elasticsearch面试内容整理-高级特性

Elasticsearch 提供了一系列高级特性,这些特性可以极大地增强其搜索、分析和管理能力,使得它在大数据场景中表现出色。以下是 Elasticsearch 的一些重要高级特性: 近实时搜索(Near Real-Time Search) Elasticsearch 的一个关键特性是 近实时搜索(NRT),这意味着数据写入…...

linux通过手工删除文件卸载oracle 11g rac的具体步骤

在linux操作系统中&#xff0c;有些时候我们自己学习和测试会临时搭建的oracle rac。事情完成后&#xff0c;我们想回收资源&#xff0c;需要去卸载oracle rac。为了快速卸载oracle rac&#xff0c;今天我们介绍下如何通过手工删除文件的方式来完成工作&#xff08;操作都需要在…...

【ArcGISPro】根据yaml构建原始Pro的conda环境

使用场景 我们不小心把原始arcgispro-py3的conda环境破坏了,我们就可以使用以下方法进行修复 查找文件 在arcgis目录下找到yaml文件 如果没找到请复制以下内容到新的yaml文件 channels: - esri - defaults dependencies: - anyio=4.2.0=py311haa95532_0 - appdirs=1.4.4=p…...

刷题笔记15

问题描述 小M和小F在玩飞行棋。游戏结束后&#xff0c;他们需要将桌上的飞行棋棋子分组整理好。现在有 N 个棋子&#xff0c;每个棋子上有一个数字序号。小M的目标是将这些棋子分成 M 组&#xff0c;每组恰好5个&#xff0c;并且组内棋子的序号相同。小M希望知道是否可以按照这…...

【LeetCode热题100】队列+宽搜

这篇博客是关于队列宽搜的几道题&#xff0c;主要包括N叉树的层序遍历、二叉树的锯齿形层序遍历、二叉树最大宽度、在每个数行中找最大值。 class Solution { public:vector<vector<int>> levelOrder(Node* root) {vector<vector<int>> ret;if(!root) …...