MYSQL八、MYSQL的SQL优化

一、SQL优化

  • sql优化是指:通过对sql语句和数据库结构的调整,来提高数据库查询、插入、更新和删除等操作的性能和效率。

1、插入数据优化

  1. 要一次性往数据库表中插入多条记录:
insert  into  tb_test  values(1,'tom');
insert  into  tb_test  values(2,'cat');
insert  into  tb_test  values(3,'jerry');.....

1.1、优化方案一(批量插入数据)

 Insert  into  tb_test  values(1,'Tom'),(2,'Cat'),(3,'Jerry');

1.2、优化方案二(手动控制事务)

start  transaction;insert  into  tb_test  values(1,'Tom'),(2,'Cat'),(3,'Jerry');insert  into  tb_test  values(4,'Tom'),(5,'Cat'),(6,'Jerry');insert  into  tb_test  values(7,'Tom'),(8,'Cat'),(9,'Jerry');commit;

1.3、优化方案三(主键顺序插入)

  1. 主键顺序插入,性能要高于乱序插入。

1.4、大批量插入数据

  1. 如果一次性需要插入大批量数据(比如: 几百万的记录),使用insert语句插入性能较低,此时可以使用MySQL数据库提供的load指令进行插入。

可以执行如下指令,将数据脚本文件中的数据加载到表结构中:

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

在load时,主键顺序插入性能高于乱序插入

2、主键优化

2.1、数据的组织方式

  1. 在InnoDB存储引擎中,表数据都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表
    • 行数据都是存储在聚集索引的叶子节点上的。
      在这里插入图片描述
  2. 在InnoDB引擎中,数据行是记录在逻辑结构 page 页中的,而每一个页的大小是固定的,默认16K。
    • 那也就意味着一个页中所存储的行也是有限的,如果插入的数据行row在该页存储不小,将会存储到下一个页中,页与页之间会通过指针连接。

在这里插入图片描述

2.2、页分裂

  1. 页可以为空,也可以填充一半,也可以填充100%。每个页包含了2-N行数据(如果一行数据过大,会行溢出),根据主键排列。
  2. MySQL中的页分裂是指:当B+tree索引中的一个页已经满了,再插入新的记录时,该页会被分裂成两个页。其中,一些记录会被留在原来的页中,而其余记录则会被移到一个新的页中。
    • 页分裂是为了避免数据过度集中在一个页上而引起的性能问题。通过将记录分散到更多的页中,可以减少索引的深度,从而提高查询效率。
    • 在MySQL中,当一个页满了之后,会触发页分裂。具体来说,MySQL会将该页中的记录按照顺序依次遍历,找到一个位置将其分为两个部分,并将后面的记录移到一个新的页中。同时,为了保证索引有序性,MySQL还会将新页中的第一条记录的键值插入到父节点中,并调整父节点中的指针。如果父节点也满了,则递归进行分裂操作。
  3. 页分裂通常会发生在以下情况:
    • 顺序插入:当数据按索引顺序插入,且最后一页已满,会创建一个新的页并在其上继续插入。
    • 乱序插入:如果数据插入到中间的某个索引位置,导致中间的页溢出,那么会把一部分数据移动到新页中,以便为新数据腾出空间。(可能还需要重新设置链表指针)

2.3、页合并

  1. 当删除一行记录时,实际上记录并没有被物理删除,只是记录被标记(flaged)为删除并且它的空间变得允许被其他记录声明使用。
  2. 当页中删除的记录达到 MERGE_THRESHOLD(默认为页的50%),InnoDB会开始寻找最靠近的页(前或后)看看是否可以将两个页合并以优化空间使用。
    在这里插入图片描述
  • 参数MERGE_THRESHOLD:是合并页的阈值,可以自己设置,在创建表或者创建索引时指定。

2.4、主键的设计原则

  1. 满足业务需求的情况下,尽量降低主键的长度。
  2. 插入数据时,尽量选择顺序插入,选择使用AUTO_INCREMENT自增主键。
  3. 尽量不要使用UUID做主键或者是其他自然主键,如身份证号。
  4. 业务操作时,避免对主键的修改。

3、order by优化

  1. MySQL的排序,有两种方式:

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

    • A. 根据排序字段建立合适的索引,多字段排序时,也遵循最左前缀法则。
    • B. 尽量使用覆盖索引。
    • C. 多字段排序, 一个升序一个降序,此时需要注意联合索引在创建时的规则(ASC/DESC)。
    • D. 如果不可避免的出现filesort,大数据量排序时,可以适当增大排序缓冲区大小 sort_buffer_size(默认256k)。

4、group by优化

  1. 在分组操作中通过以下两点进行优化,以提升性能:
    • A. 在分组操作时,可以通过索引来提高效率。(没有使用索引进行分组Extra下会出现Using temporate(使用临时表),这个性能很低的)
    • B. 分组操作时,索引的使用也是满足最左前缀法则的

5、limit优化

  1. 在数据量比较大时,如果进行limit分页查询,在查询时越往后的数据,分页查询效率越低。
    • 优化思路: 一般分页查询时,通过创建 覆盖索引 能够比较好地提高性能,可以通过覆盖索引加子查询形式进行优化。

6、count优化

  1. 如果数据量很大,在执行count操作时,是非常耗时的。
    • MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个数,效率很高; 但是如果是带条件的count,MyISAM也慢。
    • InnoDB 引擎就麻烦了,它执行 count(*) 的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数
      • 要大幅度提升InnoDB表的count效率,主要的优化思路:自己计数(可以借助于redis这样的数据库进行,但是如果是带条件的count又比较麻烦了)

6.1、count函数的用法

  1. count() 是一个聚合函数,对于返回的结果集,一行行地判断,如果 count 函数的参数不是NULL,累计值就加 1,否则不加,最后返回累计值。
    • 用法:count(*)、count(主键)、count(字段)、count(数字)
      在这里插入图片描述
  • 按照效率排序的话,count(字段) < count(主键 id) < count(1) ≈ count(*),所以尽量使用 count(*)。

7、update优化

  1. 主要需要注意一下update语句执行时的注意事项:
    • 在更新数据时,最好根据索引字段进行更新 (否则会出现行锁升级为表锁的问题,就是锁住整张表,导致并发性能降低)
-- id是主键索引
update  course  set  name = 'javaEE'  where  id  =  1 ;-- 此时执行上面的update语句只会出现行锁
  • InnoDB的行锁是针对索引加的锁,不是针对数据记录加的锁 ,并且该索引不能失效,否则会从行锁升级为表锁 。

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

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

相关文章

关于Unity四种合批技术详解

文章目录 一.静态合批(StaticBatching)1.启用静态合批2.举例说明3.静态合批的限制4.静态合批的优点缺点5.动态指定物品合批 二.动态合批(Dynamic Batching)1.启用动态合批2.合批规则3.举例说明4.使用限制 三.GPU Instancing1.启用GPU Instancing2.启用限制3.举例说明 四.SRP Ba…

解决Maven依赖引入不成功的问题

解决Maven依赖引入不成功的问题 确认IntelliJ IDEA中Maven的设置是否正确。 file --> settings --> maven 清除无效的jar&#xff0c;进入本地仓库清除或利用bat工具 以下是bat工具内容&#xff0c;运行即可。【把仓库地址换成你自己的地址进行无效jar包清除】 echo o…

配置完eslint没有用?

当你使用 npx eslint --init 生成配置文件后 你也配置好了.prettierrc 当你在代码写一点小问题的时候 发现eslint没有进行检查 原因是你生成的 .eslintrc.js中没有加上这个配置 extends: [.....plugin:prettier/recommended],加上以后重启vscode你会发现

vulhub之httpd篇

Apache 换行解析漏洞&#xff08;CVE-2017-15715&#xff09; Apache HTTPD是一款HTTP服务器&#xff0c;它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在一个解析漏洞&#xff0c;在解析PHP时&#xff0c;1.php\x0A将被按照PHP后缀进行解析&#xff0c;导致绕过一…

智能合约之路:Web3时代的商业革新之道

随着区块链技术的日益成熟和普及&#xff0c;智能合约作为其重要应用之一&#xff0c;正逐渐引领着我们进入一个全新的商业时代&#xff0c;即Web3时代。在这个时代&#xff0c;智能合约不仅改变着商业交易的方式&#xff0c;更为商业模式带来了颠覆性的革新。本文将深入探讨智…

智慧监狱技术解决方案

1. **建设背景**&#xff1a;介绍了智慧监狱建设的战略部署&#xff0c;包括司法部提出的“数字法治、智慧司法”信息化体系建设&#xff0c;以及智慧监狱建设的总体目标、重点任务和实施步骤。 2. **建设需求**&#xff1a;分析了当前监狱系统存在的问题&#xff0c;如子系统…

探索Docker容器网络

Docker容器已经成为现代应用部署的核心工具。理解Docker的网络模型对于实现高效、安全的容器化应用至关重要。在这篇博客中&#xff0c;我们将深入探讨Docker的网络架构&#xff0c;并通过一些代码例子来揭示其底层实现。 Docker网络模式 Docker提供了多种网络模式&#xff0c…

【Kubernetes】Helm--包管理工具

​​​​​​​ 微服务是什么&#xff1f; 微服务把大包解耦成小包&#xff0c;使用的时候使用java -jar包启动服务 Helm 什么是Helm&#xff1f; 在没使用 helm 之前&#xff0c;向 kubernetes 部署应用&#xff0c;我们要依次部署 deployment、svc 等&#xff0c;步骤较繁…

(游戏:三个数的加法)编写程序,随机产生三个一位整数,并提示用户输入这三个整数的和,判断用户输入的和是否正确。

(游戏:三个数的加法)编写程序&#xff0c;随机产生三个一位整数&#xff0c;并提示用户输入这三个整 数的和&#xff0c;判断用户输入的和是否正确。 package myjava; import java.math.*; import java.util.Scanner; public class cy {public static void main(String[]args)…

Swift开发——循环执行方式

本文将介绍 Swift 语言的循环执行方式 01、循环执行方式 在Swift语言中,主要有两种循环执行控制方式: for-in结构和while结构。while结构又细分为当型while结构和直到型while结构,后者称为repeat-while结构。下面首先介绍for-in结构。 循环控制方式for-in结构可用于区间中的…

跨境电商中的IP隔离是什么?怎么做?

一、IP地址隔离的概念和原理 当我们谈论 IP 地址隔离时&#xff0c;我们实际上是在讨论一种网络安全策略&#xff0c;旨在通过技术手段将网络划分为不同的区域或子网&#xff0c;每个区域或子网都有自己独特的 IP 地址范围。这种划分使网络管理员可以更精细地控制哪些设备或用…

Type-C接口显示器:C口高效连接与无限可能 LDR

Type-C显示器C接口的未来&#xff1a;高效连接与无限可能 随着科技的飞速发展&#xff0c;我们的日常生活和工作中对于高效、便捷的连接方式的需求日益增加。在这样的背景下&#xff0c;Type-C接口显示器凭借其卓越的性能和广泛的兼容性&#xff0c;正逐渐崭露头角&#xff0c…

Java中ArrayList(顺序表)的自我实现(如果想知道Java中怎么自我实现ArrayList,那么只看这一篇就足够了!)

前言&#xff1a;在 Java 编程中&#xff0c;ArrayList 是一种非常常用的数据结构&#xff0c;它提供了动态数组的实现方式&#xff0c;可以方便地存储和操作数据。相比于传统的数组&#xff0c;ArrayList 具有更多的灵活性和便利性&#xff0c;可以根据需要动态地调整大小&…

axios打通fastapi和vue,实现前后端分类项目开发

axios axios是一个前后端交互的工具&#xff0c;负责在前端代码&#xff0c;调用后端接口&#xff0c;将后端的数据请求到本地以后进行解析&#xff0c;然后传递给前端进行处理。 比如&#xff0c;我们用fastapi写了一个接口&#xff0c;这个接口返回了一条信息&#xff1a; …

后端项目怎么做?怎么准备面试,看这篇就够了!

近期群友都在海投&#xff0c;广撒网&#xff0c;为的就是等一个面试机会&#xff0c;等一个offer。 当收到面试通知的时候&#xff0c;大家一定要好好把握机会。 机会很重要&#xff0c;给你机会&#xff0c;没有把握住&#xff0c;那就比较尴尬了。 对于研发岗位来说&…

Hadoop 2.0:主流开源云架构(三)

目录 四、Hadoop 2.0体系架构&#xff08;一&#xff09;Hadoop 2.0公共组件Common&#xff08;二&#xff09;分布式文件系统HDFS&#xff08;三&#xff09;分布式操作系统Yarn&#xff08;四&#xff09;Hadoop 2.0安全机制简介 四、Hadoop 2.0体系架构 &#xff08;一&…

如何解决mfc100u.dll丢失问题,关于mfc100u.dll丢失的多种解决方法

在计算机使用过程中&#xff0c;我们常常会遇到一些错误提示&#xff0c;其中之一就是“计算显示缺失mfc100u.dll”。这个问题可能会影响到我们的正常使用&#xff0c;因此了解它的原因、表现以及解决方法是非常重要的。小编将详细介绍计算显示缺失mfc100u.dll的问题&#xff0…

音视频集式流媒体边缘分布式集群拉流管理

一直以来&#xff0c;由于srs zlm等开源软件采用传统直播协议&#xff0c;即使后面实现了webrtc转发&#xff0c;由于信令交互较弱&#xff0c;使得传统的安防监控方案需要在公网云平台上部署大型流媒体服务器&#xff0c;而且节点资源不能统一管理调度&#xff0c;缺乏灵活性和…

基于PPO的强化学习超级马里奥自动通关

目录 一、环境准备 二、训练思路 1.训练初期&#xff1a; 2.思路整理及改进&#xff1a; 思路一&#xff1a; 思路二&#xff1a; 思路三&#xff1a; 思路四&#xff1a; 3.训练效果&#xff1a; 三、结果分析 四、完整代码 训练代码&#xff1a; 测试代码&#x…

2024.ZCPC.M题 计算三角形个数

题目描述&#xff1a; 小蔡有一张三角形的格子纸&#xff0c;上面有一个大三角形。这个边长为 的大三角形&#xff0c; 被分成 个边长为 1 的小三角形(如图一所示)。现在&#xff0c;小蔡选择了一条水平边 删除&#xff08;如图二所示&#xff09;&#xff0c;请你找出图上剩余…