目  录

一、order by 优化

1.未添加索引 

2.添加索引 

3.复合索引默认升序排列

4.复合索引降序排列

5.复合索引升序降序排列并用

6.总结

 二、group by 优化

1.未添加索引 

2.添加索引

3.添加复合索引 

三、limit 优化

四、主键优化 

1.主键设计原则

 五、insert 优化

1.原则

2.load

六、count 优化

七、update 优化

1.说明

2.行级锁

(1)修改同一条记录 

(2)修改不同记录

3.表级锁


一、order by 优化

# 初始化
drop table if exists t_workers;
create table t_workers(id int primary key auto_increment,name varchar(10),age int,sal int
);
insert into t_workers(name, age, sal) values('王栋梁', 18, 3000),('李建', 23, 5000),('张昊晟', 31, 2500);
  1. 使用【explain】查看带有【order by】语句的执行计划时,【Extra】字段会显示 using index 或 using filesort。区别如下:
    1. using index:表示使用索引,因为索引提前排好序,所以效率很高;
    2. using filesort:表示使用文件排序,排序时将硬盘中的数据读取到内存中,在内存中排序,效率较低。
  2. 初始化中的实例如下。

1.未添加索引 

-- 未添加索引,根据name进行文件排序,效率较低
explain select id, name from t_workers order by name;


2.添加索引 

-- 创建索引,效率提高
create index index_tworkers_name on t_workers(name);
explain select id, name from t_workers order by name;


3.复合索引默认升序排列

-- 若需要通过两个字段排序,建议添加复合索引。按照age升序排,age相同按照sal升序
create index index_tworkers_as on t_workers(age, sal);
explain select id, age, sal from t_workers order by age, sal;


4.复合索引降序排列

        B+树叶子结点上所有数据默认升序排列。添加联合索引,若按照 age 降序排列,age 相同则按照 sal 降序排列,会使用索引吗?

explain select id, age, sal from t_workers order by age desc, sal desc;

        答案是会的,可以看到进行了 反向索引扫描。

        B+树叶子节点之间采用双向指针,可以从左向右升序,也可以从右往左降序。


5.复合索引升序降序排列并用

-- age升序,sal降序
explain select id, age, sal from t_workers order by age asc, sal desc;

        可以看到 age 使用了索引,而 sal 没有使用索引。

        但是,可以创建对应的指定排序索引解决此问题。

-- 创建指定排序索引
create index index_tworkers_as2 on t_workers(age asc, sal desc);
explain select id, age, sal from t_workers order by age asc, sal desc;


6.总结

  1. 排序也遵循最左前缀原则

  2. 使用覆盖索引

  3. 针对不同排序规则,创建不同索引。若所有字段都是升序或都是降序,则不需要创建指定排序索引;

  4. 若无法避免 filesort,要注意排序缓存大小,默认缓存大小是 256KB,可以修改系统变量 sort_buffer_size。 


 二、group by 优化

# 初始化
drop table if exists t_employees;
create table t_employees(id int primary key auto_increment,name varchar(10),age int,gender varchar(2),job varchar(10)
);
insert into t_employees(name, age, gender, job) values('刘佳佳', 21, '女', '业务员'),('王平', 23, '男', '业务员'),('郭东', 37, '男', '业务员'),('张筱雨', 32, '女', '经理'),('马菲燕', 45, '女', '经理'),('张强', 52, '男', '安保'),('寇爱国', 49, '男', '安保'),('邱政琪', 38, '男', '会计');

1.未添加索引 

explain select job, count(*) from t_employees group by job;

         可以看到,使用了临时表,效率较低。


2.添加索引

create index index_temployees_job on t_employees(job);
explain select job, count(*) from t_employees group by job;


3.添加复合索引 

create index index_temployees_aj on t_employees(job, age);
explain select age, count(*) from t_employees group by age;
explain select age, count(*) from t_employees where job = '经理' group by age;

        可以看到,group by 也遵循最左前缀原则。 


三、limit 优化

        数据量特别庞大时,使用 limit 读取数据时,越往后效率越低。可以使用【覆盖索引 + 子查询】的方式提升效率。


四、主键优化 

1.主键设计原则

  1. 主键值不要太长,二级索引叶子结点上存储的是主键值。主键值太长会导致索引占用空间较大;
  2. 尽量使用【auto_increment】生成主键,尽量不使用 uuid 作为主键,因为 uuid 不是顺序插入;
  3. 插入数据时,主键值尽量顺序插入,因为乱序插入可能会导致 B+树 的叶子结点频繁进行页分裂和页合并操作,效率较低。
    1. 在 InnoDB 中,主键值对应聚集索引,插入主键值如果是乱序的,B+树叶子结点需要不断重新排序,重新排序过程中频繁涉及页分裂和页合并操作,效率较低;
    2. B+树每个结点都存储在页中,一个页面中存储一个结点;
    3. MySQL 的 InnoDB 存储引擎,一个页可以存储 16KB 的数据;
    4. 若主键值不是顺序插入,就会导致频繁的页分裂和页合并。在一个B+树中,页分裂和页合并是树自动调整机制的一部分。当一个页已经满了,再插入一个新的关键字时就会触发页分裂操作,将页中的关键字分配到两个新的页中,同时调整树的结构。相反,当一个页中的关键字数量下降到一个阈值以下时,就会触发页合并操作,将两个相邻的页合并成一个新的页。如果主键值是随机的、不是顺序插入的,那么页的利用率会降低,页分裂和页合并的次数就会增加。由于页的分裂和合并是比较耗时的操作,频繁的分裂和合并会降低数据库系统的性能。因此,为了优化B+树的性能,可以将主键值设计成顺序插入的,这样可以减少页的分裂和合并的次数,提高B+树的性能。在实际应用中,如果对主键值的顺序性能要求不是特别高,也可以采用一些技术手段来减少页分裂和合并,例如B+树分裂时采用“延迟分裂”技术,或者通过调整页的大小和结点的大小等方式来优化B+树的性能。

  4. 尽量不使用业务主键,因为业务的变化会导致主键值频繁修改。不建议主键值修改,因为主键值修改,聚集索引一定会重新排序。


     五、insert 优化

    1.原则

    1. 数据量较大时,可以批量插入。建议一次插入数据不超过 1000 条;
    2. MySQL 默认自动提交事务,只要执行一条 DML 语句就会自动提交一次。因此,当插入大量数据时,建议手动开启事务和手动提交事务
    3. 主键值建议顺序插入,效率较高;
    4. 超大数据量插入可以考虑使用 load 命令,可以将 csv 文件中的数据批量导入到数据库表中,效率较高。每个字段间使用 “,” 隔开,每条数据另起一行。

    2.load

    # 1.登录MySQL时指定参数
    mysql --local-infile -u[用户名] -p[密码]# 2.开启local_infile功能
    set global local_infile = 1;# 3.执行load指令
    -- 首先,创建表
    load data local infile '文件存放路径' into table [表名] fields terminated by ',' lines terminated by '\n';

    六、count 优化

    1. 使用:
      1. count(主键):将每个主键值取出累加;
      2. count(常量值):获取每个常量值累加;
      3. count(字段):取出字段的每个值,判断是否为 NULL,不为 NULL则累加;
      4. count(*):不取值,直接统计总行数,效率最高。若统计一张表中总行数,建议使用。
    2. 注意:
      1. 对于 InnoDB 存储引擎,count 计数实现原理就是将表中每一条数据取出,然后累加。若想真正提高效率,可以使用其他程序实现;
      2. 对于 MyISAM 存储引擎,当一个 select 语句没有 where 条件时,获取总行数效率极高,不需要统计,因为 MyISAM 存储引擎单独维护了一个总行数。

    七、update 优化

    1.说明

    1. 存储引擎是 InnoDB 时,表的行级锁是针对索引添加的锁,若索引失效或不是索引列时,会提升为表级锁;
    2. 行级锁:有 A、B 两个事务,开启 A 事务后,通过 A 事务修改表中某条记录。修改后未提交,B 事务去修改同一条记录时无法继续,直到 A 事务提交,B 事务才可以继续;
    3. 为了提高效率,建议为 update 语句中的 where 条件添加索引。

    2.行级锁

    (1)修改同一条记录 

            行级锁,A 事务修改未提交,B 事务修改同一条记录,会无法继续执行。


    (2)修改不同记录

            行级锁,A 事务修改未提交,B 事务修改其他记录,不会影响。


    3.表级锁

            条件为非索引列或索引失效会升级为表级锁。表级锁,A 事务修改未提交。B 事务无论修改哪一条记录,都不会继续执行。

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

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

    相关文章

    湖北理元理律师事务所视角:企业债务优化的三维平衡之道

    核心提示:债务优化的本质不是消灭债务,而是在法律框架内重建财务可持续性。 一、企业债务危机的典型误区 某制造企业主曾向我坦言:“用新贷还旧贷3年,债务从200万滚到500万。”这类案例暴露出企业债务处置的共性痛点&#xff1a…

    【Ragflow】27.RagflowPlus(v0.4.1):小版本迭代,问题修复与功能优化

    概述 RagflowPlus v0.4.0 在发布后,收到了积极的反馈,同时也包含一些问题。 本次进行一轮小版本更新,发布 v0.4.1 版本,对已知问题进行修复,并对部分功能进行进一步优化。 开源地址:https://github.com/…

    【hadoop】Flink安装部署

    一、单机模式 步骤: 1、使用XFTP将Flink安装包flink-1.13.5-bin-scala_2.11.tgz发送到master机器的主目录。 2、解压安装包: tar -zxvf ~/flink-1.13.5-bin-scala_2.11.tgz 3、修改文件夹的名字,将其改为flume,或者创建软连接…

    Linux 下 ChromeDriver 安装

    个人博客地址:Linux 下 ChromeDriver 安装 | 一张假钞的真实世界 Selenium 是一个用于 Web 应用程序测试的工具。可以通过它驱动浏览器执行特定的操作,如点击、下滑、资源加载与渲染等。该工具在爬虫开发中也非常有帮助。Selenium 需要通过浏览器驱动操…

    Canal环境搭建并实现和ES数据同步

    作者:田超凡 日期:2025年6月7日 Canal安装,启动端口11111、8082: 安装canal-deployer服务端: https://github.com/alibaba/canal/releases/1.1.7/canal.deployer-1.1.7.tar.gz cd /opt/homebrew/etc mkdir canal…

    STM32使用土壤湿度传感器

    1.1 介绍: 土壤湿度传感器是一种传感装置,主要用于检测土壤湿度的大小,并广泛应用于汽车自动刮水系统、智能灯光系统和智能天窗系统等。传感器采用优质FR-04双料,大面积5.0 * 4.0厘米,镀镍处理面。 它具有抗氧化&…

    锁的艺术:深入浅出讲解乐观锁与悲观锁

    在多线程和分布式系统中,数据一致性是一个核心问题。锁机制作为解决并发冲突的重要手段,被广泛应用于各种场景。乐观锁和悲观锁是两种常见的锁策略,它们在设计理念、实现方式和适用场景上各有特点。本文将深入探讨乐观锁和悲观锁的原理、实现…

    Jinja2深度解析与应用指南

    1. 概念与用途 1.1 核心概念 Jinja2是Python生态中功能强大的模板引擎,采用逻辑与表现分离的设计思想: 模板:包含静态内容和动态占位符的文本文件(.j2后缀)渲染:将模板与数据结合生成最终文本的过程上下…

    Ubuntu20.04中 Redis 的安装和配置

    Ubuntu20.04 中 Redis 的安装和配置 Ubuntu 安装 MySQL 及其配置 1. Redis 的安装 更新系统包列表并安装 Redis : # 更新包管理工具 sudo apt update# -y:自动确认所有提示(非交互式安装) sudo apt install -y redis-server测…

    Sklearn 机器学习 缺失值处理 填充数据列的缺失值

    💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 💡使用 Scikit-learn 处理数据缺失值的完整指南 在机器学习项目中,数据缺失是不可避…

    Unity中如何播放视频

    1.创建一个原始图像并调整布局平铺整个画布 2.创建自定义纹理并调整自定义纹理大小 3.添加视频播放组件 4.将准备好的视频素材拖入到视频剪辑中 5.将自定义纹理拖入到目标纹理中 6.将自定义纹理拖入到原始图像的纹理中 最后运行游戏,即可播放视频 总结:

    Spring通用类型转换的实现原理

    Spring通用类型转换的实现原理 设计思路实现逻辑ConversionService&#xff1a;类型转换服务入口ConverterRegister&#xff1a;转换器注册接口GenericConversionService1. Map<ConvertiblePair, GenericConverter> converters2. canConvert() 与 convert()&#xff1a;服…

    红黑树完全指南:为何工程都用它?原理、实现、场景、误区全解析

    红黑树完全指南&#xff1a;为何工程都用它&#xff1f;原理、实现、场景、误区全解析 作者&#xff1a;星之辰 标签&#xff1a;#红黑树 #平衡二叉查找树 #工程实践 #数据结构 #面试宝典 引子&#xff1a;工程师的“性能焦虑”与树的进化史 你以为树只是算法题里的配角&#…

    阿里云 RDS mysql 5.7 怎么 添加白名单 并链接数据库

    阿里云 RDS mysql 5.7 怎么 添加白名单 并链接数据库 最近帮朋友 完成一些运维工作 &#xff0c;这里记录一下。 文章目录 阿里云 RDS mysql 5.7 怎么 添加白名单 并链接数据库最近帮朋友 完成一些运维工作 &#xff0c;这里记录一下。 阿里云 RDS MySQL 5.7 添加白名单1. 登录…

    Psychopy音频的使用

    Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…

    分布式互斥算法

    1. 概述&#xff1a;什么是分布式互斥 假设有两个小孩想玩同一个玩具&#xff08;临界资源&#xff09;&#xff0c;但玩具只有一个&#xff0c;必须保证一次只有一个人能够玩。当一个小孩在玩时&#xff0c;另一个小孩只能原地等待&#xff0c;直到玩完才能轮到自己。这就是 …

    [创业之路-410]:经济学 - 国富论的核心思想和观点,以及对创业者的启发

    一、国富论的核心思想和观点 《国富论》全称为《国民财富的性质和原因的研究》&#xff0c;由英国经济学家亚当斯密于1776年出版&#xff0c;是经济学领域的经典之作&#xff0c;其核心思想和观点对现代经济学的发展产生了深远影响&#xff0c;具体如下&#xff1a; 劳动价值…

    Tavily 技术详解:为大模型提供实时搜索增强的利器

    目录 &#x1f680; Tavily 技术详解&#xff1a;为大模型提供实时搜索增强的利器 &#x1f9e9; 为什么需要 Tavily&#xff1f; &#x1f50d; Tavily 是什么&#xff1f; 核心特性&#xff1a; &#x1f4e6; Tavily 在 RAG 架构中的位置 &#x1f9ea; 示例&#xff…

    欣佰特科技亮相2025张江具身智能开发者大会:呈现人形机器人全链条解决方案

    5月29日 &#xff0c;2025年张江具身智能开发者大会在上海落下帷幕。欣佰特科技作为专注人形机器人与具身智能领域的创新企业&#xff0c;携一系列前沿产品与解决方案参展&#xff0c;与全球行业专家、企业共同探讨技术落地路径&#xff0c;展现其在具身智能领域的技术积累与场…

    @Prometheus 监控-MySQL (Mysqld Exporter)

    文章目录 **Prometheus 监控 MySQL ****1. 目标****2. 环境准备****2.1 所需组件****2.2 权限要求** **3. 部署 mysqld_exporter****3.1 下载与安装****3.2 创建配置文件****3.3 创建 Systemd 服务****3.4 验证 Exporter** **4. 配置 Prometheus****4.1 添加 Job 到 prometheus…