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

《SQL基础》12. SQL优化

SQL优化

  • SQL优化
    • 数据插入
      • insert优化
      • 大批量插入数据
    • 主键优化
    • order by优化
    • group by优化
    • limit优化
    • count优化
      • count用法
    • update优化


SQL优化

数据插入

insert优化

如果我们需要一次性往数据库表中插入多条记录,可以从以下三个方面进行优化。

  • 批量插入
  • 手动控制事务
  • 主键顺序插入,性能要高于乱序插入。

大批量插入数据

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

客户端连接服务端时,加上参数
mysql --local-infile -u root -p

查看参数是否开启
SELECT @@local_infile;

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

执行load指令将准备好的数据加载到表结构中
LOAD DATA LOCAL INFILE '文件路径' INTO TABLE 表名 FIELDS TERMINATED BY '数据分隔符' LINES TERMINATED BY '行分隔符';

主键优化

数据组织方式

在InnoDB存储引擎中,表数据都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表(index organized table,IOT)。

在InnoDB引擎中,数据行是记录在逻辑结构page(页)中,而每一个页的大小是固定的,默认16K。所以一个页中所存储的行也是有限的,如果插入的数据行(row)在该页存储不下,将会存储到下一个页中,页与页之间会通过指针连接。

页分裂

页可以为空,也可以填充一半,也可以填充100%。每个页包含了2-N行数据(如果一行数据过大,会行溢出),根据主键排列。如果乱序插入,页满后重新分配,数据可能重新分配到新页中,也会涉及到页之间指针重新分配。

页合并

当删除一行记录时,实际上记录并没有被物理删除,只是记录被标记删除(flaged)并且它的空间变得允许被其他记录声明使用。
当页中删除的记录达到MERGE_THRESHOLD(默认为页的50%),InnoDB会开始寻找最靠近的页(前或后)看看是否可以将两个页合并以优化空间使用。

MERGE_THRESHOLD:合并页的阈值,可以自己设置,在创建表或者创建索引时指定。

索引设计原则

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

order by优化

MySQL的排序,有两种方式:

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

对于以上的两种排序方式,Using index的性能高,而Using filesort的性能低,我们在优化排序操作时,尽量要优化为 Using index。

order by优化原则:

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

查看排序缓冲区大小
SHOW VARIABLES LIKE 'sort_buffer_size';

group by优化

在分组操作中,通过以下两点进行优化,以提升性能:

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

limit优化

在数据量比较大时,如果进行limit分页查询,在查询时,越往后,分页查询效率越低。

优化思路:一般分页查询时,通过创建覆盖索引能够比较好地提高性能,可以通过覆盖索引加子查询形式进行优化。

例如查询一张表后2000000的10条记录:

EXPLAIN SELECT * FROM tb_sku t, (SELECT id FROM tb_sku ORDER BY id LIMIT 2000000, 10) a WHERE t.id = a.id;

count优化

MyISAM引擎把一个表的总行数存在了磁盘上,执行count(*)的时候会直接返回这个数,效率很高;但是如果是带条件的count,MyISAM也慢。

InnoDB引擎执行count(*)的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。

提升InnoDB表的count效率,主要优化思路:自己计数

count用法

count() 是一个聚合函数,对于返回的结果集,一行行地判断,如果 count 函数的参数不是NULL,累计值就加 1,否则不加,最后返回累计值。

用法

  • count(主键)
    InnoDB 引擎会遍历整张表,把每一行的主键值都取出来,返回给服务层。服务层拿到主键后,直接按行进行累加(主键不可能为null)

  • count(字段)

    • 没有 not null 约束:InnoDB 引擎会遍历整张表把每一行的字段值都取出来,返回给服务层,服务层判断是否为null,不为null,计数累加。
    • 有 not null 约束:InnoDB 引擎会遍历整张表把每一行的字段值都取出来,返回给服务层,直接按行进行累加。
  • count(数字)
    InnoDB 引擎遍历整张表,但不取值。服务层对于返回的每一行,放一个数字(相当于一个标记)进去,直接按行进行累加。

  • count(*)
    InnoDB引擎并不会把全部字段取出来,而是专门做了优化,不取值,服务层直接按行进行累加。

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

update优化

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

相关文章:

《SQL基础》12. SQL优化

SQL优化SQL优化数据插入insert优化大批量插入数据主键优化order by优化group by优化limit优化count优化count用法update优化SQL优化 数据插入 insert优化 如果我们需要一次性往数据库表中插入多条记录&#xff0c;可以从以下三个方面进行优化。 批量插入手动控制事务主键顺…...

fork之后是子进程先执行还是父进程先执行

CFS(完全公平调度器)是Linux内核2.6.23版本开始采用的进程调度器&#xff0c;它的基本原理是这样的&#xff1a;设定一个调度周期(sched_latency_ns)&#xff0c;目标是让每个进程在这个周期内至少有机会运行一次&#xff0c;换一种说法就是每个进程等待CPU的时间最长不超过这个…...

2023年java初级面试题(5道)

一、两个对象值相同(x.equals(y) true)&#xff0c;但却可有不同的hash code&#xff0c;这句话对不对&#xff1f;答&#xff1a;不对&#xff0c;如果两个对象x和y满足x.equals(y) true&#xff0c;它们的哈希码&#xff08;hash code&#xff09;应当相同。Java对于eqauls…...

【内网安全】——Linux权限维持

作者名&#xff1a;白昼安全主页面链接&#xff1a; 主页传送门创作初心&#xff1a; 以后赚大钱座右铭&#xff1a; 不要让时代的悲哀成为你的悲哀专研方向&#xff1a; web安全&#xff0c;后渗透技术每日鸡汤&#xff1a; 钱至少对于现在的我来说&#xff0c;的确是万能的在…...

Linux 真实使用内存计算

获取Linux内存信息&#xff0c;可通过cat /proc/meminfo查看&#xff0c;比如&#xff0c;Ubuntu 20.04.5 LTS上会显示以下信息&#xff1a; leoyaDESKTOP-LMR:~$ cat /proc/meminfo MemTotal: 16017572 kB MemFree: 15637472 kB MemAvailable: 15533140 kB Bu…...

Unity Jobsystem ECS

简介随着ECS的加入&#xff0c;Unity基本上改变了软件开发方面的大部分方法。ECS的加入预示着OOP方法的结束。随着实体组件系统ECS的到来&#xff0c;我们在Unity开发中曾使用的大量实践方法都必须进行改变以适应ECS&#xff0c;也许不少人需要些时间适应ECS的使用&#xff0c;…...

Java中创建线程有哪几种方式

1.继承Thread类 总结&#xff1a;通过继承 Thread 类&#xff0c;重写 run() 方法&#xff0c;而不是 start() 方法 Thread 类底层实现 Runnable 接口类只能单继承 接口可以多继承2.实现Runnable接口 总结&#xff1a;通过实现 Runnable 接口,实现 run() 方法&#xff0c;依然…...

C++【string类用法详细介绍string类模拟实现解析】

文章目录string 类用法介绍及模拟实现一、string介绍二、string类常用接口1. string类对象的常见构造接口2.string类对象的常见容量接口3.string类对象的常见修改接口4. string类对象的常见访问及遍历接口5.string其他接口1.不常用查找接口2.字符替换3.字符串拼接4.字符串排序5…...

常见的开发模型和测试模型

软件的生命周期软件开发阶段的生命周期需求分析->计划->设计->编码->测试->运维软件测试阶段的生命周期需求分期->测试计划->测试设计与开发->执行测试->测试评估开发模型瀑布模型可以看到,这个模型和我们上面的软件开发生命周期很相似采用的是线性…...

印度和印度尼西亚有什么关系吗?

印度和印度尼西亚&#xff0c;这两个国家很多人都比较熟悉。因为两国都是人口大国&#xff0c;而且经济总量也比较高&#xff0c;在全球还是有很大影响的。不过很多人刚看到这两个国家的时候&#xff0c;都会觉得这两个国家肯定有什么关系&#xff0c;要不然国名也不会这么像。…...

单调栈(C/C++)

目录 1. 单调栈的定义 2. 单调栈的常见用途 3. 案例分析 3.1 暴力解法 3.2 单调栈 4. 单调栈总结 1. 单调栈的定义 单调栈顾名思义&#xff0c;就是栈内的元素是单调的。根据栈内元素的单调性的不同&#xff0c;可以分为&#xff1a; 单调递增栈&#xff1a;栈内元素是单…...

算法设计与智能计算 || 专题一: 算法基础

专题一: 算法基础 文章目录专题一: 算法基础1. 算法的定义及特点1.1 算法的基本特征1.2 算法的基本要素1.3 算法的评定2 算法常见执行方法2.1 判断语句2.2 循环语句2.3 综合运用3. 计算复杂度4. 代码的重用5. 类函数的定义与使用5.1 定义类5.2 调用类函数1. 算法的定义及特点 …...

用javascript分类刷leetcode13.单调栈(图文视频讲解)

239. 滑动窗口最大值 (hard) 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1&#xff1a; 输入&#xff1a;nums [1,…...

英语基础语法学习(B站英语电力公司)

1. 句子结构 五大基本句型&#xff1a; 主谓主谓宾主谓宾宾主谓宾宾补主系表 谓语&#xff1a; 一般来说&#xff0c;谓语是指主语发出的动作。&#xff08;动词&#xff09;但是很多句子是没有动作的&#xff0c;但是还是必须要有谓语。&#xff08;此时需要be动词&#x…...

【计算机网络】网络层IP协议

文章目录一、认识IP协议二、IP协议头部格式三、IP地址划分1. IP地址分类2. 子网划分四、IP地址数量危机1. IP地址的数量限制2. NAT技术五、私网IP和公网IP六、路由1. 认识路由2. 路由表生成算法一、认识IP协议 IP协议是Internet Protocol&#xff08;互联网协议&#xff09;的…...

Eclipse快捷键大全

编辑类快捷键Ctrl1: 快速修复(最经典的快捷键, 可以解决很多问题, 比如import类、try catch包围等)CtrlShiftF: 格式化当前代码CtrlShiftM: 添加类的import导入CtrlShiftO: 组织类的导入(既有CtrlShiftM的作用,又可以去除没用的导入, 一般用这个导入包)CtrlY: 重做(与CtrlZ相反…...

JavaScript 高级2 :构造函数和原型 d331702016e84f54b3594ae05e0eeac

JavaScript 高级2 &#xff1a;构造函数和原型 Date: January 16, 2023 Text: 构造函数和原型、继承、ES5中的新增方法 目标 能够使用构造函数创建对象 能够说出原型的作用 能够说出访问对象成员的规则 能够使用 ES5新增的一些方法 构造函数和原型 概述 在典型的 OOP 的…...

maven-war-plugin插件 overlays maven-war-plugin翻译

说明 翻译maven-war-plugin插件的部分内容 官方地址为&#xff1a;https://maven.apache.org/plugins/maven-war-plugin/index.html Overview 概述 Introduction 介绍 Apache Maven WAR Plugin apache maven war 插件 The WAR Plugin is responsible for collecting all artifa…...

【数据结构】初识二叉树(二叉树的入门知识)

初识二叉树一、树概念及结构1、树的概念2、树的相关概念3、树的表示4、树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09;二、二叉树概念及结构1、概念2、特殊的二叉树3、二叉树的性质4、二叉树的存储结构三、结语一、树概念及结构 1、树的概念 树是一种非线…...

RV1126笔记三十二:基于 FastDeploy 在 RV1126 上的部署示例(RV1126 上部署 YOLOv5 检测模型测试)

若该文为原创文章,转载请注明原文出处。 FastDeploy是一款全场景、易用灵活、极致高效的AI推理部署工具, 支持云边端部署。提供超过 🔥160+ Text,Vision, Speech和跨模态模型📦开箱即用的部署体验,并实现🔚端到端的推理性能优化。包括 物体检测、字符识别(OCR)、…...

掌握TegraRcmGUI:从入门到精通的Switch注入实践指南

掌握TegraRcmGUI&#xff1a;从入门到精通的Switch注入实践指南 【免费下载链接】TegraRcmGUI C GUI for TegraRcmSmash (Fuse Gele exploit for Nintendo Switch) 项目地址: https://gitcode.com/gh_mirrors/te/TegraRcmGUI TegraRcmGUI是一款基于C开发的图形化界面工具…...

Electron + Vue 3 + Vite 桌面应用开发:从零到打包的实战指南

1. 为什么选择Electron Vue 3 Vite组合 如果你正在寻找一种既能快速开发又能保证性能的桌面应用解决方案&#xff0c;Electron Vue 3 Vite的组合绝对值得考虑。这个组合最大的优势在于开发体验的提升&#xff0c;特别是对于那些已经熟悉Vue生态的开发者来说。 Vite带来的开…...

不会画画也能创作!梦幻动漫魔法工坊新手入门全攻略

不会画画也能创作&#xff01;梦幻动漫魔法工坊新手入门全攻略 1. 为什么你需要这个工具 你是否曾经有过这样的经历&#xff1a;脑海中浮现出一个绝妙的动漫角色形象&#xff0c;却因为不会画画而无法将它呈现出来&#xff1f;或者想为社交媒体创作独特的二次元头像&#xff…...

Axure 9.0 原生组件:绘制折线图

引言在原型设计中&#xff0c;数据可视化是传递核心信息的关键手段&#xff0c;而折线图凭借 “清晰展示数据趋势” 的优势&#xff0c;广泛应用于销售波动、用户增长、指标变化等场景。Axure 9.0 作为主流原型工具&#xff0c;虽未内置现成折线图组件&#xff0c;但通过「形状…...

共享图书借阅系统 Java 源码 + 数据库设计完整方案

以下是一个共享图书借阅系统的Java源码与数据库设计的完整方案&#xff0c;涵盖系统架构、核心功能实现、数据库设计以及安全防护措施等方面&#xff1a;一、系统架构技术栈&#xff1a;后端&#xff1a;Spring Boot 2.x MyBatis-Plus&#xff08;简化数据库操作&#xff09;前…...

Palo Alto PAN-OS 12.1.5 VM-Series for ESXi, KVM - 基于机器学习的下一代防火墙操作系统

Palo Alto PAN-OS 12.1.5 Orion 发布 - 基于机器学习的下一代防火墙操作系统 PAN-OS 12.1 Orion delivers industry firsts including quantum readiness, unified multi-cloud protection, and more. 请访问原文链接&#xff1a;https://sysin.org/blog/pan-os-12/ 查看最新…...

QwQ-32B多模态应用实践:文本与图像联合处理

QwQ-32B多模态应用实践&#xff1a;文本与图像联合处理 最近在折腾AI模型的时候&#xff0c;发现很多朋友对多模态应用特别感兴趣。所谓多模态&#xff0c;简单说就是让AI能同时理解文字和图片&#xff0c;甚至还能把两者结合起来处理。这听起来挺酷的&#xff0c;但实际操作起…...

别只看成功率!拆解AlphaFold3在抗体对接中那60%的失败案例

AlphaFold3抗体对接失败的深层解析&#xff1a;60%案例背后的技术挑战与突破路径 当AlphaFold3&#xff08;AF3&#xff09;在抗体-抗原对接领域取得8.9%的高精度成功率时&#xff0c;科学界为之振奋。但鲜少有人关注到&#xff0c;在单种子采样条件下&#xff0c;这一系统仍有…...

Canvas Quest跨平台部署实践:从星图GPU到本地环境的迁移

Canvas Quest跨平台部署实践&#xff1a;从星图GPU到本地环境的迁移 1. 前言&#xff1a;为什么需要跨平台部署 最近遇到不少开发者朋友在问同一个问题&#xff1a;在星图GPU平台上跑得好好的Canvas Quest模型&#xff0c;怎么迁移到本地环境就各种报错&#xff1f;这其实是个…...

Qwen3.5-2B图文对话实战:教育场景中学生作业图题智能解析案例

Qwen3.5-2B图文对话实战&#xff1a;教育场景中学生作业图题智能解析案例 1. 引言&#xff1a;教育场景中的AI助手需求 想象一下这样的场景&#xff1a;晚上10点&#xff0c;孩子拿着数学作业来问问题&#xff0c;题目是一张手绘的几何图形。家长可能已经忘记了几十年前学过的…...