Mysql进阶-sql优化篇

sql优化

  • sql优化
    • insert优化
      • 批量插入
      • 手动提交事务
      • 主键顺序插入
      • 大批量插入数据
    • 主键优化
      • 数据组织方式
      • 页分裂
      • 页合并
      • 主键设计原则
    • order by 优化
      • 原则
    • group by优化
    • limit优化
    • count 优化
      • count的几种用法
    • update优化

sql优化

insert优化

批量插入

Insert into tb_test values(1,'Tom'),(2,'Cat'),(3, erry');

手动提交事务

start transaction;
insert into tb_test values(1,'Tom'),(2,'Cat'),(3,Jerry');
insert into tb_test values(4,'Tom'),(5,'Cat'),(6,Jerry');
insert into tb_test values(7,Tom'),(8,'Cat'),(9,!erry');
commit;

主键顺序插入

# 主键顺序插入: 1,2,3,4,5,6,7....
# 主键乱序插入:1,4,2,6,9,5,8....

大批量插入数据

如果一次性需要插入大批量数据,使用inset语句插入性能较低,此时可以使用MySQL数据库提供的load指令进行插入。操作如下:
在这里插入图片描述

主键优化

数据组织方式

在InnoDB存储引擎中,表数据都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表(index organized table)lOT
在这里插入图片描述

页分裂

页可以为空,也可以填充一半,也可以填充100%。每个页包含了2-N行数据(如果一行数据多大,会行溢出),根据主键排列。
在这里插入图片描述
在这里插入图片描述

性能损耗:页分裂需要重新分配内存并移动数据,这是一项耗时的操作。
空间浪费:页分裂后,新页通常不是完全填满的,这可能导致数据碎片和空间浪费。
树的不平衡:频繁的页分裂可能导致B+树的结构不平衡,进而影响查询性能。

页合并

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

主键设计原则

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

order by 优化

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

可以给排序字段建索引

# 举个例子
create index idx_age_pho on tb_user(age,phone);
# 还可以为字段值定升序还是降序
create index idx_age_pho on tb_user(age asc,phone desc);

原则

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

group by优化

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

limit优化

一个常见又非常头疼的问题就是 limit 2000000,10 ,此时需要MySOL排序前2000010 记录,仅仅返回2000000 - 2000010的记录,其他记录丢弃,查询排序的代价非常大。

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

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(*)的时候会直接返回这个数,效率很高;
innoDB引擎:就麻烦了,它执行 count()的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。

优化思路: 可以使用redis进行计数,当插入一条数据就+1,删除就-1。

count的几种用法

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

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

在这里插入图片描述

update优化

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

update tb_user set name='zhangsan' where name='lisi'
# 如果update的where条件的字段name没有加索引,此时为表锁,事务没有提交的话,其他update不能完成。

后记
👉👉💕💕美好的一天,到此结束,下次继续努力!欲知后续,请看下回分解,写作不易,感谢大家的支持!! 🌹🌹🌹

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

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

相关文章

百信银行的喜和忧:业绩与不良规模同增,曾因踩红线被罚500万元

近日,有报道指出,陪伴中信百信银行股份有限公司(下称“百信银行”)走过七年光阴的首任行长李如东已离任,离任原因或与“7年轮岗”监管规定有关。作为替代,中信银行科技信息部总经理寇冠出任百信银行行长。 …

【高阶数据结构(三)】图的遍历最小生成树问题

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:高阶数据结构专栏⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习更多Go语言知识   🔝🔝 高阶数据结构 1. 前言2. 图的遍…

Android Compose 一:基础控件

Flutter 与 Compose 组件辣么像,难道是同一个google团队整的;也未深究,只是猜测。 创建项目 需要使用新版本Android studio,忽略步骤… 项目目录 MainActivity说明 1 系统默认页面 Preview 修饰的方法,只用来供开发…

【Linux】-Linux用户和权限与权限的修改[3]

目录 一、认知root用户 1、root用户(超级管理员) 2、su和exit命令 3、sudo命令 二、用户、用户组管理 1、用户管理 2、getent 三、查看权限控制 1、认知权限信息 四、修改权限控制 - chmod 五、修改权限控制 - chown 一、认知root用户 1、root…

C#调用电脑摄像头拍照

1.打开VS2019,新建一个Form窗体,工具->NuGet包管理工具->管理解决方案的NuGet包,在浏览里搜索AForge.Controls、AForge.Video.DirectShow,安装AForge.Controls和AForge.Video.DirectShow 2.安装AForge组件完成后&#xff0c…

Spring底层入门(十一)

1、条件装配 在上一篇中,我们介绍了Spring,Spring MVC常见类的自动装配,在源码中可见许多以Conditional...开头的注解: Conditional 注解是Spring 框架提供的一种条件化装配的机制,它可以根据特定的条件来控制 Bean 的…

如何快速提取出一个文件里面全部指定类型的文件的全部路径

首先,需要用到的这个工具: 度娘网盘 提取码:qwu2 蓝奏云 提取码:2r1z 打开工具,切换到第五个模块,文件批量复制模块(快捷键:Ctrl5) 点击右边的“搜索添加”按钮&#…

[windows系统安装/重装系统][step-2]BIOS设置UEFI引导、磁盘分区GPT分区、安装系统[含完整操作拍照图片]

重装系统三部曲 [windows系统安装/重装系统][step-1]U盘启动盘制作,微软官方纯净系统镜像下载-CSDN博客 [windows系统安装/重装系统][step-2]BIOS设置UEFI引导、磁盘分区GPT分区、安装系统[含完整操作拍照图片]-CSDN博客 [windows系统安装/重装系统][step-3]装驱动…

开源免费的定时任务管理系统:Gocron

Gocron:精准调度未来,你的全能定时任务管理工具!- 精选真开源,释放新价值。 概览 Gocron是github上一个开源免费的定时任务管理系统。它使用Go语言开发,是一个轻量级定时任务集中调度和管理系统,用于替代L…

使用Android数据恢复恢复已删除的文件[Windows]

智能手机或平板电脑等 Android 设备为用户提供了发送、接收、处理和存储各种数据的能力。它提供了传统手机无法实现的多功能性和简化功能。即便如此,您管理存储在安卓设备中的数据的方式完全取决于您。如果您的手机出现问题,例如系统崩溃或操作系统更新失…

Python-VBA函数之旅-sum函数

目录 一、sum函数的常见应用场景 二、sum函数使用注意事项 三、如何用好sum函数? 1、sum函数: 1-1、Python: 1-2、VBA: 2、推荐阅读: 个人主页: https://myelsa1024.blog.csdn.net/ 一、sum函数的常…

2024.5.19 机器学习周报

引言 Abstract 文献阅读 1、题目 X-HRNET: TOWARDS LIGHTWEIGHT HUMAN POSE ESTIMATION WITH SPATIALLY UNIDIMENSIONAL SELF-ATTENTION 2、引言 高分辨率表示是人体姿态估计实现高性能所必需的,随之而来的问题是高计算复杂度。特别地,主要的姿态估…

外网如何访问内网?快解析

由于公网IP资源短缺,我们的电脑大多处于内网环境,如何在外网访问内网电脑,成为一个令人头疼的问题,下面我给大家推荐一个非常实用的方法。 1:访问快解析下载安装快解析服务器 2:运行软件,点击“…

ASP.NET MVC(二) HtmlHelper

强类型 》》》 Form Html.Action() 执行一个Action,并返回html字符串。 Html.ActionLink() 生成一个超链接。 》》》 htmlhelper 扩展方法 /// 扩展方法 三要素 静态类静态方法this 》》》》上面需要引入命名空间, 》》》 不需要引入命名空间 pu…

systrace使用

systrace使用 chrome://tracing/ 抓trace方法 1.脚本 在sdk/platformtools/systrace文件目录下执行: python2 systrace.py -b 32000 -o setting_qian.html gfx input view webview wm am audio video camera app ss sched irq freq idle disk load sync workq reg…

Sublime Text for Mac:强大的文本编辑器

Sublime Text for Mac,一款轻量而强大的文本编辑器,为您的编程和写作工作带来无限可能。它以其简洁的界面和出色的性能,成为Mac用户中备受推崇的编辑器之一。 Sublime Text支持多种编程语言,无论是Python、JavaScript、HTML还是CS…

GNSS地表位移监测仪的工作原理

TH-WY1GNSS地表位移监测仪是一种用于实时监测地表位移变化的仪器设备。它主要利用全球导航卫星系统(GNSS)或全球定位系统(GPS)技术,通过接收卫星信号来测量地表点位的移动变化,从而获取地表点位的精确坐标信息,进而监测地表的水平和垂直位移情…

基于微信小程序的预约挂号系统(源码)

博主介绍:✌程序员徐师兄、10年大厂程序员经历。全网粉丝12W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅&#x1f447…

中控系统智能化管理,多媒体展厅展示效果大升级!

在当今数字展厅设计的热潮中,多媒体互动理念已经崭露头角,成为各大企业竞相采纳的主流设计方式,它们通过集成的多媒体展示手段,为企业提供了一个全新的平台,来展现其形象、产品与服务,更通过互动的方式加深…

使用nvm安装node.js过程

今天Jade尝试安装nvm,并使用命令安装node.js但是碰到了一些问题,在此作为学习记录分享出来。希望可以留下深刻的印象: 1、概念了解 nvm----- (Node.js version manager)是一个命令行应用,可以协助您快速地 更新、安装、使用、卸载…