MySQL数据库——SQL优化(3/3)-limit 优化、count 优化、update 优化、SQL优化 小结

news2024/11/28 4:49:44

目录

limit 优化

count 优化

概述

count用法

update 优化

SQL优化 小结


limit 优化

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


当在进行分页查询时,如果执行limit 2000000,10,此时需要MySQL排序前2000010条记
录,仅仅返回 2000000 ~ 2000010 的记录,其他记录丢弃,查询排序的代价非常大。

优化思路

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

使用覆盖索引:

select id from tb_sku order by id limit 2000000,10;

-- 使用到了主键索引,效率高

加上子查询:(当作两张表进行查询)

select * from tb_sku t , (select id from tb_sku order by id limit 2000000,10) a
where t.id = a.id;

count 优化

概述

在之前的测试中,我们发现,如果数据量很大,在执行count操作时,是非常耗时的。

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

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

如果说要大幅度提升InnoDB表的count效率,主要的优化思路:自己计数,自己维护计数变量(可以借助于redis这样的数据库进行,但是如果是带条件的count又比较麻烦了)。

count用法

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

用法:count(*)、count(主键)、count(字段)、count(数字)

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

没有not null 约束 : InnoDB 引擎会遍历整张表把每一行的字段值都取出来,返回给服务层,服务层判断是否为null,不为null,计数累加。

有not null 约束:InnoDB 引擎会遍历整张表把每一行的字段值都取出来,返回给服务层,直接按行进行累加。

count(数字)InnoDB 引擎遍历整张表,但不取值。以count(1)为例,服务层对于返回的每一行,放一个数字“1”进去,直接按行进行累加。
count(*)InnoDB引擎并不会把全部字段取出来,而是专门做了优化,不取值,服务层直接按行进行累加。

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

update 优化

我们主要需要注意一下update语句执行时的注意事项。

update course set name = 'javaEE' where id = 1

当我们在执行上述的SQL语句时,会锁定id为1这一行的数据,在事务提交之后,行锁才会释放。

但是当我们在执行如下SQL时。

update course set name = 'SpringBoot' where name = 'PHP' 

当我们开启多个事务,在执行上述的SQL时,我们发现行锁升级为了表锁。

导致该update语句的性能大大降低。

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

SQL优化 小结

插入数据

  • insert:批量插入、手动控制事务、主键顺序插入
  • 大批量插入: load data local infile

主键优化

  • 主键长度尽量短,顺序插入(否则会造成页分裂)         AUTO_INCREMENT        UUID   主键不使用uuid

order by 优化

  • using index:直接通过索引返回数据,性能高
  • using filesort:需要将返回的结果在排序缓冲区排序

group by 优化

  • 使用索引,多字段分组满足最左前缀法则

limit 优化

  • 覆盖索引+子查询

count 优化

  • 性能:count(字段)<count(主键id)<count(1)\approxcount(*)

update 优化

  • 尽量根据主键/索引字段进行数据更新

END


学习自:黑马程序员——MySQL数据库课程

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

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

相关文章

11 | JpaRepository 如何自定义

EntityManager 介绍 Java Persistence API 规定&#xff0c;操作数据库实体必须要通过 EntityManager 进行&#xff0c;而我们前面看到了所有的 Repository 在 JPA 里面的实现类是 SimpleJpaRepository&#xff0c;它在真正操作实体的时候都是调用 EntityManager 里面的方法。…

Java中的正则表达式

1、体验正则表达式 import java.util.regex.Matcher; import java.util.regex.Pattern;/*** Description: 体验正则表达式:提取英文单词* Author: yangyongbing* CreateTime: 2023/10/16 08:38* Version: 1.0*/ public class Regexp {public static void main(String[] args)…

【Bug】ERROR ResizeObserver loop completed with undelivered notifications.

【Bug】ERROR ResizeObserver loop completed with undelivered notifications. 报错如下&#xff1a; ERROR ResizeObserver loop completed with undelivered notifications.at handleError (webpack-internal:///./node_modules/webpack-dev-server/client/overlay.js:299…

Qt 视口和窗口的区别

视口和窗口 绘图设备的物理坐标是基本的坐标系&#xff0c;通过QPainter的平移、旋转等变换可以得到更容易操作的逻辑坐标 为了实现更方便的坐标&#xff0c;QPainter还提供了视口(Viewport)和窗口(Window)坐标系&#xff0c;通过QPainter内部的坐标变换矩阵自动转换为绘图设…

802.1x协议详解,802协议工作原理/认证过程、MAB认证、EAP报文格式

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 802.1x协议 1、什么是802.1x协议2、802.1x架构3、触…

【LeetCode热题100】-- 45.跳跃游戏II

45.跳跃游戏II 方法&#xff1a;贪心 在具体的实现中&#xff0c;维护当前能够到达的最大下标的位置&#xff0c;记为边界。从左到右遍历数组&#xff0c;到达边界时&#xff0c;更新边界并将跳跃次数加一 在遍历数组时&#xff0c;不访问最后一个元素&#xff0c;因为在访问…

命令的历史管理

查看历史命令 cat ~/.bash_history history 清除历史命令 history -c >~/.bash_history 指定命令清除历史命令 history -d 55 vim /etc/profile 修改source /etc/profile (保存修改内容)

麒零8000S到底是7纳米还是14纳米?一切都因台积电玩坏了工艺命名

日本分析机构在拆解了国产5G手机对5G芯片进行扫描后&#xff0c;认为它的工艺只有14纳米&#xff0c;而一些专家则认为这是7纳米&#xff0c;导致如此混乱的原因在于台积电玩坏了芯片工艺的命名规则。 在16纳米之前&#xff0c;芯片制造企业是以栅极间距来认定芯片工艺的&#…

车联网场景中 JT/T 808 协议终端免开发快速接入阿里云 IoT 物联网平台实战

车联网场景中 JT/T 808协议 是一种在中国广泛应用的车载终端通信协议&#xff0c;用于车辆与监控中心之间的数据通信。 01 JT/T808 协议 JT/T808 协议是指交通部颁布的《道路运输车辆卫星定位系统终端通讯协议及数据格式》&#xff0c;广泛应用于车辆远程监管、物流管理、车辆安…

基于SpringBoot+vue的汽车销售管理系统

文章目录 项目介绍主要功能截图&#xff1a;登录首页新订单客户管理添加库存车辆库存管理报表管理员工管理 部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简…

LLM Tech Map 大模型技术图谱

LLM Tech Map 大模型技术图谱 从基础设施、大模型、Agent、AI 编程、工具和平台&#xff0c;以及算力几个方面&#xff0c;为开发者整理了当前 LLM 中最为热门和硬核的技术领域以及相关的软件产品和开源项目。 核心价值&#xff1a;帮助技术人快速了解 LLM 的核心技术和关键方向…

Java毕业设计基于springboot+vue的影视信息网站

项目介绍 影城管理系统的主要使用者分为管理员和用户&#xff0c;实现功能包括管理员&#xff1a;首页、个人中心、用户管理、电影类型管理、放映厅管理、电影信息管理、购票统计管理、系统管理、订单管理&#xff0c;用户前台&#xff1a;首页、电影信息、电影资讯、个人中心…

块链串的实现(c语言)

串有三种三种顺序串&#xff0c;链式串和块链式串 常用的是第一种顺序串 前两者我在这就不进行讲解了&#xff0c;因为就是普通的顺序表和链式表只是其中的值必须是字符而已 为啥需要引入块链式串&#xff0c;我们之前分析过链表的优点是操作方便&#xff0c;而缺点是&#x…

USB协议学习(一)帧格式以及协议抓取

USB协议学习&#xff08;一&#xff09;帧格式以及协议抓取 笔者来聊聊MPU的理解 这里写自定义目录标题 USB协议学习&#xff08;一&#xff09;帧格式以及协议抓取MPU的概念以及作用MPU的配置新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式…

数据挖掘(5)分类数据挖掘:基于距离的分类方法

一、分类挖掘的基本流程 最常用的就是客户评估 1.1分类器概念 1.2分类方法 基于距离的分类方法决策树分类方法贝叶斯分类方法 1.3分类的基本流程 步骤 建立分类模型 通过分类算法对训练集训练&#xff0c;得到有指导的学习、有监督的学习预定义的类&#xff1a;类标号属性确定…

【UE4 材质编辑篇】1.0 shader编译逻辑

UE4新手&#xff0c;学起来&#xff08;&#xff09;文章仅记录自己的思考。 参考&#xff1a;虚幻4渲染编程(材质编辑器篇)【第一卷&#xff1a;开篇基础】 - 知乎 (zhihu.com) 开篇基础就摸不着头脑&#xff0c;原因是此前完全没有摸过UE4&#xff0c;一点一点记录吧&#x…

18 | 生产环境多数据源的处理方法有哪些

工作中我们时常会遇到跨数据库操作的情况&#xff0c;这时候就需要配置多数据源&#xff0c;那么如何配置呢&#xff1f;常用的方式及其背后的原理支撑是什么呢&#xff1f;我们下面来了解一下。 首先看看两种常见的配置方式&#xff0c;分别为通过多个 Configuration 文件、利…

绘制多个子图fig.add_subplot函数

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 绘制多个子图 fig.add_subplot函数 下列代码创建的子图网格大小是&#xff1f; import matplotlib.pyplot as plt fig plt.figure() ax fig.add_subplot(121) ax.plot([1, 2, 3, 4, 5], [1…

做情绪识别,有必要用LLM吗?

卷友们好&#xff0c;我是尚霖。 情绪识别在各种对话场景中具有广泛的应用价值。例如&#xff0c;在社交媒体中&#xff0c;可以通过对评论进行情感分析来了解用户的情绪态度&#xff1b;在人工客服中&#xff0c;可以对客户的情绪进行分析&#xff0c;以更好地满足其需求。 此…

堆与堆排序

一.什么是堆&#xff1f; 1.堆是完全二叉树&#xff0c;除了树的最后一层结点不需要是满的&#xff0c;其它的每一层从左到右都是满的&#xff0c;如果最后一层结点不是满的&#xff0c;那么要求左满右不满。 2.堆分为两类&#xff0c;大根堆和小根堆。 大根堆每个结点都大于…