SQL优化学习笔记

SQL优化

insert优化

常规优化思路

  • 每次插入数据时都需要和数据库建立连接、关闭连接,因此批量插入会大量节省IO避免浪费。(每次500-1000条)
  • 开启手动提交事务(start transaction … commit)
  • 主键顺序插入:主键插入顺序为1 2 3 4 5 6 … 顺序插入而非乱序插入

大批量插入数据

  • 如果一次性需要插入大量批量数据,使用MySQL数据库提供的load指令进行插入。每个字段的格式要和表中字段格式对应。

    # 客户端连接服务器时,加上参数 --loacal-infile
    mysql --local-infile -u root -p
    # 设置全局参数local_infile为1,开启从本地加载文件导入数据的开关。(查看select @@local_infile)
    set global local_infile=1;
    # 执行load指令将准备好的数据,加载到表结构中
    load data local infile '/root/sql1.log' into table `t_user` fileds terminated by ',' lines terminated by '\n';   # 每一列使用,分隔。每一列使用\n分隔
    
主键优化

在innodb存储引擎中,表数据都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表

在这里插入图片描述

页分裂 & 页合并

  1. 在插入数据到页时,页可以为空,也可以填充一半,也可以填充100%。每个页包含了2-N行(至少两行)的数据。

    在这里插入图片描述

  2. 在删除数据时,页中的数据并没有被实际物理删除,只是记录被标记(flaged)为删除并且它的空间变得允许被其他记录声明使用。当页中删除的记录达到MERGE_THRESHOLD(默认为页的50%),Innodb会开始寻找最靠近的页并判断是否能将两个页合并为一个页以优化空间。

    在这里插入图片描述

主键设计原则:

  1. 尽量降低主键长度
  2. 插入数据时尽量选择顺序插入,选择使用AUTO_INCREMENT自增
  3. 尽量不要使用UUID做主键,或是身份证
  4. 业务操作时避免对主键的修改
order by优化

Using filesort:通过全表扫面,读取满足条件的行,然后在排序缓冲区sort buffer完成排序操作。所有不是通过索引直接返回排序结果的排序都叫Using filesort

Using index:通过有序索引顺序扫描直接返回有序数据,这种排序叫做Using index。操作效率高于Using filesort

group by优化

主要研究索引对于分组操作的影响。

Using temporary:使用额外临时表进行分组,性能低、开销大。

Using index:使用索引字段进行分组,性能高。(使用索引时必须符合最左前缀法则否则依然Using temporary)

limit优化

在大数据量的分页查询中,如果limit 2000000 10,此时MySQL排序前2000010 的记录,仅仅返回2000000~2000010 的记录,其他记录丢弃,查询排序的代价非常大。

优化思路:覆盖索引+子查询。通过创建覆盖索引能够比较好的提高性能,可以通过覆盖索引加子查询的方式优化。

# 先通过主键索引查出想要的数据id
select id from student order by id limit 9000000,10;
# 查询出的id值就是我们需要的9000000 ~ 9000010之间的值,再通过联表查询的方法将数据查出
select s.*              # 查询s表中所有值
from student s,(select id from student order by id limit 9000000,10) a  # 子查询出需要的id
wheres.id = a.id;    # 联表查询条件
count优化

在MyISAM存储引擎中将表的总行数存在了磁盘上,因此如果是:select count(*) from t_user。不带条件查询,会直接返回总行数,效率非常高。

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

优化思路:自己计数。在Redis中统计如果执行insert则+1,delete则-1。count不计入NULL值

几种用法:

  • count(主键):InnoDB会遍历整张表,把每一行的主键id都取出来,返回给服务层。服务层拿到数据后直接进行累加(主键不可能为NULL)。
  • count(字段):
    • 没有not null约束时InnoDB会遍历整张表把每一行的字段值都取出来,返回给服务层。服务层判断是否为null,不为null时则计数累加。
    • 有not null时InnoDB将每行数据取出来,返回给服务层。服务层直接进行计数累加
  • count(1):InnoDB会遍历整张表但是不取值。服务层对于返回的每一行都插入一个 “1” ,并直接进行累加。这里无论是count(1) 、 count(0) 、 count(-1)都是一样的。
  • count(*):InnoDB不取值,服务层直接按行累加。

效率排行:count(字段) < count(主键) < count(1) ≈ count(*)

update优化

在InnoDB中行锁是针对索引字段单独设立的,如果在update中’索引失效’则行锁升级为表锁。这样会大大降低并发性能。

例:

# 用户1
begin;     # 开启事务
update student set name = 'zhangsan' where id = 1;# 用户2
begin;     # 开启事务
update student set name = 'lisi' where id = 3;# 用户1提交事务
commit;
# 用户2提交事务
commit;
# 如果where后的条件字段不是索引字段的话,InnoDB会自动将行锁升级为表锁。也就是说,如果where name = 'xxx'; name不是索引字段的话,用户1开启事务时,用户2就无法给student表中插入任何数据
小结
  1. 插入数据SQL优化:load、手动控制事务、顺序插入
  2. 主键优化:长度尽量短、有序插入、主键自增
  3. order by优化:Using firesort、Using index
  4. group by优化:Using temporary、Using index
  5. limit优化:覆盖查询+子查询的方式来优化分页查询
  6. count优化:使用count(*)、自己维护数据库行数
  7. update优化:where条件后的字段尽量为索引字段,否则InnoDB会将行锁升级为表锁。降低并发性能。

The end.

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

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

相关文章

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Hidden Search Widget (交互式搜索框)

&#x1f4c5; 我们继续 50 个小项目挑战&#xff01;—— Hidden Search Widget 组件 仓库地址&#xff1a;https://github.com/SunACong/50-vue-projects 项目预览地址&#xff1a;https://50-vue-projects.vercel.app/ ✨ 组件目标 点击按钮展开隐藏的搜索框 再次点击按钮…

大模型——多模态检索的RAG系统架构设计

文章目录 1. 系统架构设计核心组件 2. 跨模态向量空间对齐方案方法一&#xff1a;预训练对齐模型&#xff08;如CLIP&#xff09;方法二&#xff1a;跨模态投影网络方法三&#xff1a;联合微调 3. 混合检索策略4. 关键问题解决Q: 如何解决模态间向量尺度不一致&#xff1f;Q: 如…

【NGINX】 -10 keepalived + nginx + httpd 实现的双机热备+ 负载均衡

文章目录 1、主架构图1.1 IP地址规划 2、web服务器操作3、配置nginx服务器的负载均衡4、配置keepalived4.1 master4.1 backup 5、测试双机热备5.1 两台keepalived服务器均开启5.2 模拟master节点故障 1、主架构图 1.1 IP地址规划 服务器IP地址web1192.168.107.193web2192.168.…

SQL 多表关联与分组聚合:解密答题正确率分析

一、问题拆解&#xff1a;从业务需求到SQL逻辑 1.1 需求分析 题目要求&#xff1a;计算浙江大学用户在不同难度题目下的答题正确率&#xff0c;并按正确率升序排序。 关键分析点&#xff1a; 数据来源&#xff1a; user_profile&#xff1a;存储用户信息&#xff08;大学&a…

VS Code启动Git导致大量磁盘读写 - 解决方案

问题 通过VS Code打开项目后&#xff0c;若项目使用了Git&#xff0c;且文件数目较多&#xff0c;则VS Code会自动在后台调用Git检查项目修改&#xff0c;会造成大量磁盘读写&#xff0c;严重影响电脑性能。 解决方案 在VS Code设置中关闭Git功能&#xff0c;在终端中使用Gi…

Vue3 与 Vue2 区别

一、Vue3 与 Vue2 区别 对于生命周期来说&#xff0c;整体上变化不大&#xff0c;只是大部分生命周期钩子名称上 “on”&#xff0c;功能上是类似的。不过有一点需要注意&#xff0c;组合式API的Vue3 中使用生命周期钩子时需要先引入&#xff0c;而 Vue2 在选项API中可以直接…

网络安全之身份验证绕过漏洞

漏洞简介 CrushFTP 是一款由 CrushFTP LLC 开发的强大文件传输服务器软件&#xff0c;支持FTP、SFTP、HTTP、WebDAV等多种协议&#xff0c;为企业和个人用户提供安全文件传输服务。近期&#xff0c;一个被编号为CVE-2025-2825的严重安全漏洞被发现&#xff0c;该漏洞影响版本1…

Word2Vec模型学习和Word2Vec提取相似文本体验

文章目录 说明Word2Vec模型核心思想两种经典模型关键技术和算法流程优点和局限应用场景 Word2Vec提取相似文本完整源码执行结果 说明 本文适用于初学者&#xff0c;体验Pytorch框架在自然语言处理中的使用。简单了解学习Word2Vec模型&#xff0c;体验其使用。 Word2Vec模型 …

flutter 配置 安卓、Ios启动图

android 配置启动图 launch_background.xml <?xml version"1.0" encoding"utf-8"?> <!-- Modify this file to customize your launch splash screen --> <layer-list xmlns:android"http://schemas.android.com/apk/res/android&…

MCP(一)——QuickStart

目录 1. MCP简介2. MCP的优势3. MCP核心4. QuickStart For Server Developers(仅具参考)4.1 MCP核心概念4.2 构建MCP服务器的代码4.2.1 设置MCP服务器实例4.2.2 辅助函数4.2.3 实现工具执行4.2.4 在Cherry-Studio中添加MCP服务器4.2.5 演示4.2.5.1 测试工具get_alerts4.2.5.2 测…

Nginx网站功能

一.基于授权的访问控制 1.基于授权的访问控制简介 Nginx与Apahce 一样&#xff0c;可以实现基于用户授权的访问控制&#xff0c;当客户端想要访问相应网站或者目录时&#xff0c;要求用户输入用户名和密码才能正常访问&#xff0c;配置步骤与Apache基本一致。 2.基于授权的访…

海外盲盒系统开发:重构全球消费体验的科技引擎

当盲盒文化席卷全球&#xff0c;海外盲盒系统开发已成为重构消费体验的核心赛道。数据显示&#xff0c;2025年全球盲盒市场规模突破120亿&#xff0c;东南亚市场年增长率达4540。我们开发的海外盲盒系统&#xff0c;以技术创新为驱动&#xff0c;打造覆盖全链路的全球化解决方案…

数学建模初等模型应用

一、目的 掌握初等模型的建模方法,对简单的初等模型能借助Matlab工具软件进行辅助建模、求解和检验。 二、实验内容与设计思想&#xff08;设计思路、主要代码分析&#xff09; 1、预测鱼的质量 &#xff08;1&#xff09;设计思路&#xff1a;使用线性回归模型预测鱼的质量…

C 语言学习笔记(指针1)

内容提要 函数 变量的作用域变量的生命周期 指针 预备知识变量指针与指针变量 函数 变量的作用域 引入问题 我们在函数设计的过程中&#xff0c;经常要考虑对于参数的设计&#xff0c;换句话说&#xff0c;我们需要考虑函数需要几个参数&#xff0c;需要什么类型的参数&a…

【Linux】第二十二章 访问网络附加内存

1. NFS的主要功能是什么&#xff1f; NFS是由Linux、UNIX及类似操作系统使用的互联网标准协议&#xff0c;主要功能就是提供网络文件共享&#xff0c;允许不同的计算机系统之间通过网络共享文件&#xff0c;它使得网络上的计算机能够像访问本地文件系统一样访问远程计算机上的…

大模型时代,Python 近红外光谱与 Transformer 模型:学习的必要性探究

在当下大语言模型盛行的时代&#xff0c;各类新技术如潮水般不断涌现&#xff0c;让人应接不暇。身处这样的浪潮之中&#xff0c;不少人心中都会泛起疑问&#xff1a;Python 近红外光谱和 Transformer 模型还有学习的必要性吗&#xff1f;今天&#xff0c;就让我们深入探讨一番…

强化学习鱼书(7)——神经网络和Q学习

代码地址 书内附代码地址 https://github.com/oreilly-japan/deep-learning-from-scratch-4 环境搭建 0.建立虚拟环境 conda create -n env_test python3.10 conda activate env_test1.安装cuda 50系的显卡只支持torch的nightlycuda12.8版本&#xff0c;别的版本会显示no k…

数据建模与分析:从回归预测到特征聚类的全面探索(PyTorch)

文章目录 简介&#xff1a;数据建模简介回归分析回归分析简介回归分析建模判定系数估计标准差住房价格回归预测 聚类聚类简介聚类分析建模植物花卉特征聚类 主成分分析&#xff08;PCA&#xff09;主成分分析简介成分分析建模地区竞争力指标降维 简介&#xff1a; 在现代数据科…

uv 包管理工具使用教程

一、简介 uv 是一个基于 Rust 实现的超快 Python 包管理工具&#xff0c;旨在加速 Python 开发流程。它是 pip、pip-tools、virtualenv 和 venv 的现代替代品&#xff0c;支持更快的包解析、安装和虚拟环境创建。 主要特性包括&#xff1a; 极快的依赖解析与安装 自动创建和…

5分钟应急响应+99%达标率:AI智能监控重塑商业清洁新标准

一、方案整体架构 面对商业综合体日均10万客流量带来的管理挑战&#xff0c;传统保洁模式在人员监管、质量评估和应急响应方面存在显著瓶颈。本系统以全场景AI监控为核心&#xff0c;构建三级智能化管理体系&#xff1a; 1. 前端感知层&#xff1a;部署800万像素广角摄像…