MySQL进阶-----limit、count、update优化

目录

前言

一、limit优化

1. 未优化案例

 2.优化后案例

二、count优化

count用法

三、update优化

 1.锁行情况(有索引)

2.锁表情况(无索引)


前言

        上一期我们学习了order by优化和group by优化,本期我们就继续学习sql语句的优化,分为以下三个部分MySQL进阶-----limit、count、update优化。正文如下:

一、limit优化

这里我有一张表tb_sku 里面有400w条数据,以这个表作为案例对象

在数据量比较大时,如果进行 limit 分页查询,在查询时,越往后,分页查询效率越低。
我们一起来看看执行 limit 分页查询耗时对比:

1. 未优化案例

(1)查询起始索引0后面10条记录
select * from tb_sku limit 0,10;

可以看出耗时几乎为0,一下子就完成了 

(2)查询起始索引100w后的10条记录 

select * from tb_sku limit 1000000,10;

这里耗时要3秒多,需要的时间变长了

(3) 查询起始索引300w后的10条记录 

select * from tb_sku limit 3000000,10;

这里耗时几乎翻倍,要11秒多。所以越往后需要的时间就越多。

通过测试我们会看到,越往后,分页查询效率越低,这就是分页查询的问题所在。
因为,当在进行分页查询时,如果执行 limit 2000000,10 ,此时需要 MySQL 排序前 2000010
录,仅仅返回 2000000 - 2000010 的记录,其他记录丢弃,查询排序的代价非常大 。
优化思路 : 一般分页查询时,通过创建 覆盖索引 能够比较好地提高性能,可以通过覆盖索引加子查询形式进行优化。

 2.优化后案例

已知当前表的主键为id,其已有索引,那么我们试一下把上面的*换为查询id

select id from tb_sku limit 3000000,10;

下面我们通过子查询的形式来去优化分页查询 

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

这里查询只需要6秒多 ,查询同样的数据,相较于上面的直接查询少了5秒,将近一半。

二、count优化

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

  • MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个 数,效率很高; 但是如果是带条件的countMyISAM也慢。
  • InnoDB 引擎就麻烦了,它执行 count(*) 的时候,需要把数据一行一行地从引擎里面读出 来,然后累积计数。
我们都知道MySQL一般主要用到的引擎就是InnoDB 引擎,如果说要大幅度提升InnoDB 表的 count 效率,主要的优化思路:自己计数 ( 可以借助于 redis 这样的数据库进行, 但是如果是带条件的 count 又比较麻烦了 ) 。所以下面我们要进一步了解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 引擎遍历整张表,但不取值。服务层对于返回的每一行,放一个数字“1” 进去,直接按行进行累加。

count(*)

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

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

三、update优化

下面有一张表courses,数据如下,这里就以这个表作为案例对象

在finalshell这里我们开启两个窗口,然后分别登录MySQL

然后开启事务,执行语句

 1.锁行情况(有索引)

A.左边窗口

update courses set c_name='JavaScript' where id=2;

 B .右边窗口

update courses set c_name='htmlcss' where id=1;

 好了,上面两个表都开启了事务,执行update语句,从结果可以看出这两个并发的事务并没有发生冲突,然后下面我们把两边窗口事务进行提交。

再次查询更新后表数据: 执行到这里是没问题的,没有发送阻塞情况,最终表也是更新完成。这是因为这里使用的是行锁,也就是where语句后面定位到的是id字段,这

update courses set c_name='C++' where c_name='JavaScript';

个字段是有索引的,故会把这一行锁住,但我们去执行其他行的时候与本行无关,所以不会发生冲突阻塞。所以当我们在执行删除的SQL语句时,会锁定id为1这一行的数据,然后事务提交之后,行锁释放。

2.锁表情况(无索引)

同样的我们还是用两个窗口看看锁表情况的案例:

A.左边窗口

update courses set c_name='msyql' where c_name='htmlcss';

B.右边窗口 

update courses set c_name='C++' where c_name='JavaScript';

右边窗口的执行结果跟我们预期的不一样,并没有继续执行下去,而是卡在这里了,这是因为出现了锁表的情况,也就是说左边窗口执行的事务没有提交之前,整个表都是被锁住的,所以其他事务是无法对这个表进行操作的。

当我们去提交了左边窗口的事务后,再看看右边窗口的执行情况。

 表锁释放了,所以执行成功。然后我们把右边窗口的事务进行提交。最后查看更新后的表数据。

我们主要需要注意一下 update语句执行时的注意事项。 当我们开启多个事务,在执行上述的 SQL 时,我们发现行锁升级为了表锁。 导致该 update 语句的性能 大大降低。所以假如我们对c_name字段创建一个索引的话就不会出现锁表情况,如果要执行更新操作的话,我们要提前去看看where后面的字段有没有索引。
InnoDB的行锁是针对索引加的锁,不是针对记录加的锁 ,并且该索引不能失效,否则会从行锁升级为表锁 。

以上就是本期的全部内容了,我们下次见!

分享一张壁纸:

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

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

相关文章

Pytorch-张量形状操作

&#x1f606;&#x1f606;&#x1f606;感谢大家的观看&#x1f606;&#x1f606; &#x1f339; reshape 函数 transpose 和 permute 函数 view 和 contigous 函数 squeeze 和 unsqueeze 函数 在搭建网络模型时&#xff0c;掌握对张量形状的操作是非常重要的&#xff…

AI大模型日报#0415:贾佳亚团队新作王炸、马斯克首款多模态大模型、ChatGPT to B

导读&#xff1a; 欢迎阅读《AI大模型日报》&#xff0c;内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了每条资讯的摘要。标题: 融合ChatGPTDALLE3&#xff0c;贾佳亚团队新作开源&#xff1a;识图推理生图一站解决 摘要: 贾佳亚团队推出了多模态模型Mini-Gem…

【VIC水文模型】模型原理简介

VIC水文模型原理 VIC水文模型概述土壤&#xff08;Soil&#xff09;积雪&#xff08;Snow&#xff09;动态湖和湿地模型动态湖&#xff08;Lake Model&#xff09;湿地模型&#xff08;Wetland Model&#xff09; 1 VIC模型陆面水文过程&#xff08;产流过程&#xff09;1.1 能…

PyQt5设计师QtDesigner控件箱控件介绍及讲解

QtDesigner Qt Designer 是一个由Qt官方提供的图形用户界面设计工具&#xff0c;旨在帮助开发者快速、方便地设计和布局Qt应用程序的用户界面。Qt Designer提供了一个直观的可视化界面&#xff0c;开发者可以通过拖放、设置属性等方式设计界面&#xff0c;而无需编写繁琐的布局…

007 springboot整合mybatis-plus 增删改查 ModelAndView jsp 分页

文章目录 MybatisplusConfig.javaReceiveAddressController.javaReceiveAddress.javaReceiveAddressMapper.javaReceiveAddressServiceImpl.javaIReceiveAddressService.javaServerResult.javaServletInitializer.javaSpringbootDemoApplication.javareceive_address.sqlReceiv…

【canvas】canvas基础使用(九):文本绘制

简言 canvas除了能够绘制图形外&#xff0c;也可以绘制文本。 绘制文本 fillText() 填充文本 CanvasRenderingContext2D 对象的方法 fillText() 是 Canvas 2D API 的一部分&#xff0c;它在指定的坐标上绘制文本字符串&#xff0c;并使用当前的 fillStyle 对其进行填充。存…

论文解读:FREE LUNCH FOR FEW-SHOT LEARNING: DISTRIBUTION CALIBRATION

文章汇总 问题 学习到的模型很容易因为只有少数训练样本形成的有偏分布而变得过拟合。 动机 我们假设特征表示中的每个维度都遵循高斯分布&#xff0c;因此分布的均值和方差可以借鉴类似类的均值和方差&#xff0c;这些类的统计量可以通过足够数量的样本得到更好的估计。 …

11.盛最多水的容器(Java,双指针)

目录 题目描述&#xff1a;输入&#xff1a;输出&#xff1a;代码实现&#xff1a; 题目描述&#xff1a; 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同…

Vue - 5( 16000 字 Vue2 入门级教程)

一&#xff1a;Vue 初阶 1.1 组件自定义事件 在 Vue 中&#xff0c;组件间通过自定义事件进行通信是一种常见的模式。自定义事件允许子组件向父组件发送消息&#xff0c;也可以在组件内部进行事件的绑定、触发和解绑。让我们详细讲解这些知识点。 1.1.1 组件自定义事件 在 …

季节更迭 关爱不变 | 鲁南制药四季守护您的健康生活

春天&#xff0c;万物复苏的季节&#xff0c;一切都充满了生机和活力。在春日的阳光下&#xff0c;鲜花盛开&#xff0c;绿叶茂盛&#xff0c;鸟儿欢歌&#xff0c;蝴蝶翩翩起舞。我们的身体也需要特别的关爱和养护&#xff0c;保持健康和活力&#xff0c;更好地迎接每一次季节…

知识跟踪模型GraphKT

1 知识跟踪Knowledge Tracing的概念 知识跟踪可以用来解决自适应学习问题。如何通过与教学材料的在线互动来有效地跟踪学生的学习进展&#xff1f;知识跟踪可用于量化学生的知识状态&#xff0c;即对教材所涉及的技能掌握水平。用于评估和模拟学生随着时间推移对技能的认知掌握…

前端CSS讲义1

什么是 CSS? CSS 指层叠样式表 样式定义如何显示 HTML 元素 样式通常存储在样式表中 把样式添加到 HTML 4.0 中&#xff0c;是为了解决内容与表现分离的问题 外部样式表可以极大提高工作效率 外部样式表通常存储在 CSS 文件中 多个样式定义可层叠为一 样式对网页中元素…

AI数字人对话之RealChar框架源码解读

零.功能介绍 与虚拟角色(非形象)进行文本或语音会话 体验地址:RealChar. 代码库:GitHub - Shaunwei/RealChar: 🎙️🤖Create, Customize and Talk to your AI Character/Companion in Realtime (All in One Codebase!). Have a natural seamless conversation with AI…

姿态估计-人脸识别mesh-3d手势识别-3d目标检测-背景分割-人脸关键点

往期热门博客项目回顾&#xff1a;点击前往 计算机视觉项目大集合 改进的yolo目标检测-测距测速 路径规划算法 图像去雨去雾目标检测测距项目 交通标志识别项目 yolo系列-重磅yolov9界面-最新的yolo 姿态识别-3d姿态识别 深度学习小白学习路线 AI健身教练-引体向上…

字节8年经验之谈 —— 聊一聊自动化测试为什么很难落地!

聊一聊自动化测试为什么很难落地 在软件开发和质量保障的领域&#xff0c;测试是确保软件质量的关键环节。自动化测试是一种利用脚本和工具自动执行测试用例的方法&#xff0c;可以提高测试效率、减少人工错误&#xff0c;并支持持续集成和交付。自动化测试作为提高测试效率和…

企业图纸管理软件,企业图纸管理软件有哪些推荐?

企业图纸管理软件是一种专门用于组织、存储、管理和共享企业图纸及相关文档的工具。这类软件可以帮助企业实现图纸的集中化、规范化管理&#xff0c;提高工作效率&#xff0c;降低管理成本。 企业图纸管理软件的核心功能通常包括以下几个方面&#xff1a; 集中化管理&#xff1…

bestvike --bvframe学习

ref title fetch后台api 分页属性&#xff0c;pagination 要差几条&#xff1f;pagelimit 在api中写一个饭方法&#xff0c;vue中用用他 vue.cinfig.js中配置别名 nacos微服务 实体类要继承basedata&#xff08;封装了公共数据&#xff09; 控制器autowired&#xff0c;getm…

lua 环境安装

下载地址&#xff1a; https://luabinaries.sourceforge.net/download.html 安装环境变量 检查一下是否安装成功&#xff0c;有版本号&#xff0c;打印一句话&#xff0c;如下表示成功 idea 安装插件&#xff0c;方便编写lua脚本 配置一下idea 运行测试 local function m…

Linux的重要命令(二)+了解Linux目录结构

目录 一.Linux的目录结构 二.查看文件内容命令 1.cat 命令 2.more 命令 3.less 命令 4.head 命令 5.tail 命令 6.拓展 head 和 tail 的其他用法 ​编辑 三.统计文件内容的命令-wc ​编辑 四.检索和过滤文件内容的命令-grep ​编辑 ​编辑 五.压缩命令 gzip 和 bz…

【SpringBoot】返回参数

返回参数 返回页面返回数据返回 html 代码返回 json 数据两数相加用户登录 返回页面 首先在 static 文件夹中创建 index.html 文件&#xff1a; 代码&#xff1a; <html> <body><h1>hello word!!!</h1><p>this is a html page</p> <…