嗨,你的MySQL性能瓶颈在这!

news2025/2/27 1:49:47

MySQL的高级用法和性能优化

  • 1. MySQL的高级用法
    • 1.1 replace into 用法
    • 1.2 内连接(inner join)
      • 1.2.1 等值连接
      • 1.2.2 非等值连接
      • 1.2.3 左连接
      • 1.2.4 右连接
    • 1.3 索引
      • 1.3.1 索引的概念
      • 1.3.2 索引的分类
      • 1.3.3 索引的优点
      • 1.3.4 索引的缺点
      • 1.3.5 索引的使用场景
  • 2. 性能优化
    • 2.1 避免索引失效
    • 2.2 SQL 语句调优
    • 2.3 合理的数据库设计
    • 2.4 定位执行效率慢的 sql 语句

在这里插入图片描述
欢迎阅读本文,今天我们将一同深入学习数据库操作的高级用法以及性能优化的技巧。数据库作为现代应用的重要组成部分,其高效操作和性能优化对于应用的稳定性和用户体验至关重要。通过本文的学习,您将能够掌握一些常用的数据库性能优化技巧,从而提升应用的性能和响应速度。

1. MySQL的高级用法

1.1 replace into 用法


replace intoinsert into 功能类似
replace into 首先尝试插入数据到列表中,

  1. 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。
  2. 否则,直接插入新数据。

要注意的是:插入数据的表必须有主键或者是唯一索引!否则的话,replace into会直接插入数据,这将导致表中出现重复的数据。

replace into table_name(col_name, ...) values(...)
replace into table_name(col_name, ...) select ...
replace into table_name set col_name = value,...

1.2 内连接(inner join)

1.2.1 等值连接


  1. 概述

    指使用等号"="比较两个表的连接列的值,相当于两表执行笛卡尔后,取两表连接列值相等的记录。

  2. 语法

    SELECTFROM1 INNER JOIN2
    ON1.=2.

1.2.2 非等值连接


  1. 概述

    指使用大于号">“或小于号”<"比较两个表的连接列的值,相当于两表执行笛卡尔积后,取一个表大于或小于另一个表的连接列值的记录。

  2. 语法

    SELECTFROM1 INNER JOIN2
    ON1.<>2.

1.2.3 左连接


  1. 概述

    指以左表为基准进行查询,左表数据会全部显示出来,右表如果和左表匹配的数据则显示相应字段的数据,如果不匹配则显示为NULL;

  2. 语法

    SELECTFROM1 LEFT JOIN2
    ON1.=2.

1.2.4 右连接


  1. 概述

    指以右表为基准进行查询,右表数据会全部显示出来,左表和右表匹配的数据则显示相应字段的数据,如果不匹配则显示未NULL。

  2. 语法

    SELECTFROM1 RIGHT JOIN2
    ON1.=2.

1.3 索引

1.3.1 索引的概念


索引存储在内存中,为服务器存储引擎快速找到记录的一种数据结构。索引的主要作用是加快数据查找速度,提高数据库的性能

1.3.2 索引的分类


  1. 普通索引:最基本的索引,它没任何限制
  2. 唯一索引:与普通索引类似,不同的就是索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
  3. 主键索引:它是一种特殊的唯一索引,用于唯一标识数据表中的某一条记录,不允许有空值,一般使用 primary key 来约束。
  4. 联合索引(又叫复合索引):多个字段上建立的索引,能够加速复合查询条件的检索。
  5. 全文索引:老版本 MySQL 自带的全文索引只能用于数据库引擎为MyISAM的数据表,新版本 MySQL 5.6 的 InnoDB 支持全文索引。默认 MySQL 不支持中文全文检索,可以通过扩展 MySQL ,添加中文全文检索或为中文内容表提供一个对应的英文索引表的方式来支持中文。

1.3.3 索引的优点


  1. 创建唯一索引,保证数据表中每一行数据的唯一性
  2. 打打加快数据的检索速度,这也是创建索引的最主要的原因
  3. 加快表与表之间的连接,特别是实现数据的参考完整性方面特别有意义。
  4. 在使用分组和排序字句进行数据检索时,同样可以显著减少查询中分组和排序的时间。

1.3.4 索引的缺点


  1. 创建索引和维护索引都需要耗费时间,并且随着数据量的增加所耗费的时间也会增加
  2. 索引也需要占用空间,我们知道数据表中的数据也会有最大上限设置,如果我们有大量的索引,索引文件可能会比数据文件更快达到上线值
  3. 当对表中的数据进行增加、删除、修改时,索引也需要动态的维护,降低了数据的维护速度

1.3.5 索引的使用场景


并不是每个字段设置索引就好,也不是索引越多越好,而是需要自己合理的使用

  1. 对查询频次较高,且数据量比较大的表,建立索引
  2. 索引字段的选择,最佳候选列应当从 where 子句的条件中提取,如果 where 子句中的组合比较多,那么应该挑选最常用的,过滤效果最好的列的组合
  3. 在同一值少的列上(字段上)不要建立索引,比如在学生表中“性别”字段上只有男、女两个不同值。相反的,在一个字段上不同值较多适合建立索引。
  4. 范围查询,左边的列不能使用索引,否则右边的索引也会失效
  5. 不要在索引字段上使用运算,否则索引也会失效
  6. 字符串不加引号,造成索引失效
  7. 尽量使用覆盖索引,避免 select * 这样能提高查询效率
  8. or 关键字连接,or 前面列有索引,or 后面列没有索引,那么查询的时候前后索引都会失效

2. 性能优化

在这里插入图片描述

2.1 避免索引失效


  • 如果在查询的时候,使用了复合索引,要遵循最左前缀法则,也就是查询从索引的最左别开始,并不能跳过索引中的列。
  • 尽量不要再 where 子句中对字段进行 NULL 值判断,否则将导致引擎放弃使用索引而进行全表扫描
  • 不做列运算 where age + 1 = 10,任何对列的操作都将导致表扫描,它包括数据库教程函数。计算表达式等,都会使索引失效
  • 查询 like ,如果是 '%aaa' 也会造成索引失效
  • 应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描

2.2 SQL 语句调优


  • 根据业务场景建立复合索引,只查询业务需要的字段,如果这些字段被索引覆盖,将极大的提高查询效率
  • 多表连接的字段上需要建立索引,这样可以极大提高表连接的效率
  • where 条件字段上需要建立索引,但 where 条件上不要使用运算函数,以免索引失效
  • 排序字段上,因为排序效率低,添加索引能提高查询效率
  • 优化 insert 语句:批量列插入数据要比单个列插入数据效率高
  • 优化 order by 语句:在使用 order by 语句时,不要使用 select,select 后面要查有索引的列,如果一条 sql 语句中对多个列进行排序,在业务允许情况下,尽量同时用升序或同时用降序
  • 优化 group by 语句:在我们对某个字段进行分组的时候,MySQL默认就进行了排序,但是排序并不是我们业务所需的,额外的排序会降低效率,所以在用的时候可以禁止排序,使用 order by null 禁用
  • 尽量避免子查询,可以将子查询优化为 join 多表连接查询

2.3 合理的数据库设计


根据数据库三范式来进行表结构的设计。设计表结构时,就需要考虑如何设计才能更有效的查询,遵循数据库三范式:

  • 1NF:数据表中每个字段都必须是不可拆分的最小单元,也就是确保每一列的原子性
  • 2NF:满足1NF 后,表中每一列必须有唯一性,都必须依赖于主键
  • 3NF:满足 2NF 后,表中的每一列只与主键直接相关而不是间接相关(外键也是直接相关),字段没有冗余

注意:没有最好的设计,只有最合适的设计,所以不要过分注重理论。三范式可以作为一个基本依据,不要生搬硬套。有时候可以根据场景合理的规范化:

  1. 保留冗余字段。当两个或多个表在查询中经常需要连接时,可以在其中一个表上增加若干冗余的字段,以避免表之间的连接过于频繁,一般在冗余列的数据不经常变动的情况下使用。
  2. 增加派生列。派生列是由表中的其他多个列的计算所得,增加派生列可以减少统计运算,在数据汇总时可以大大缩短运算时间,前提是这个列经常被用到,这就是反#NF。
  3. 分割表
    • 数据表拆分:主要就是垂直拆分和水平拆分。
    • 水平切分:将记录散列到不同的表中,各表的结构完全相同,每次从分表中查询,提高效率。
    • 垂直切分:将表中大字段单独拆分到另外一张表,形成一对一的关系
  4. 字段设计
    • 表的字段尽可能用NOT NUL
    • 字段长度固定的表查询会更快
    • 把数据库的大表按时间或一些标志分成小表

2.4 定位执行效率慢的 sql 语句


  • 命令:show status like ‘Com____’,通过这条命令,我们可以知道当前数据库是以查询为主还是更新为主。如果是查询为主,就重点查询;如果增删改多就重点优化写入操作。
  • explain + sql语句查询sql执行过程,通过执行计划,我们能得到哪些信息:
    • 哪些步骤花费的成本比较高
    • 哪些步骤产生的数据量多,数据量的多少用线条的粗细表示,很直观
    • 这条sql语句是否走索引
  • show profile分析SQL,可以查看所有sql语句的执行效率(所用时间)。前提是这个命令需要被打开,严格的说也就是打开这个命令后执行的所有sql语句, 它都能记录下执行时间,并展示出来。可以通过这个命令分析哪些sql语句执行效率低。 耗时长,就更有针对性的优化这条sql。
  • 慢查询日志(常用的工具)
    慢查询日志记录了所有执行时间超过参数 long_query_time的sql语句的日志,long_query_time默认为10秒(可以通过配置文件设置),日志保存在 /var/lib/mysql/目录下,有个slow_query.log文件。

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

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

相关文章

高级身份威胁检测系统可检测拦截攻防演练漏洞

近期将迎来大型攻防演练活动。随着各种实战攻防演练活动和红队&#xff08;攻击队&#xff09;利用 0-Day 及 N-Day 漏洞频繁攻击&#xff0c;甲方的蓝队&#xff08;防守队&#xff09;会出现应接不暇。攻击队为了拿到靶机完成演习目的&#xff0c;一定会拿出最先进的攻击手段…

侯捷 C++ part2 兼谈对象模型笔记——4 specialization 特化

4. specialization 特化 4.1 全特化 full specialization 模板是泛化&#xff0c;特化是泛化的反面&#xff0c;可以针对不同的类型&#xff0c;来设计不同的东西 其语法为template<> struct xxx<type> template<> struct hash<char> { ...size_t …

window7 安装JDK17下载安装

1、下载JDK JDK下载官网&#xff1a;https://www.oracle.com/ 2、安装JDK 双击打开下载好的JDK进入安装界面 选择安装的位置 等待安装成功 安装成功 3、环境变量配置 右键此电脑选择属性选择高级系统设置&#xff08;展示是win7系统&#xff0c;win10也有仔细找找&#xff09;…

优思学院|质量第一的目的是什么?

国外有一句很著名的话&#xff1a;Quality comes first, profit is its logical sequence&#xff0c;意思是&#xff1a;质量第一&#xff0c;利润是其合理的结果&#xff0c;这句话也是很多公司或者商店使用的标语。 简而言之&#xff0c;只要你把质量放在第一位&#xff0c…

C语言 冒泡排序

目录 一、原理 二、代码演示 三、代码优化 一、原理 假设&#xff1a; int arr[] { 9,8,7,6,5,4,3,2,1,0 }; 将 arr 内的元素进行升序排列&#xff0c;得到一个新的数组 int arr[] { 0&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;…

数字经济时代,如何加强应用数据保护?

在数字经济时代&#xff0c;加强应用数据保护对于个人和组织来说至关重要。以下是一些加强应用数据保护的建议&#xff1a; 合规法律法规&#xff1a;了解并遵守适用于您所在地区或行业的数据保护法律法规。这包括个人隐私保护法、数据安全法等。 安全意识培训&#xff1a;为组…

Simulink仿真模块 - Trigonometric Function

Trigonometric Function:指定应用于输入信号的三角函数 在仿真库中的位置为:Simulink / Math Operations HDL Coder / Math Operations 模型为: 双击模型打开参数设置界面,如图所示: 说明 Trigonometric Function 模块执行常见的三角函数,并以 rad 为单位输出结…

京东h5滑块

大表哥们我又来了&#xff0c;今日话题&#xff1a;凑字数水文章。 今天来看看这个h5的滑块&#xff0c;老早之前写过一篇关于京东手势验证的&#xff0c;链接在这&#xff0c;大家感兴趣可以去看看。 京东手势验证_某东滑块_逆向学习之旅的博客-CSDN博客 这个怎么讲&#xf…

2023年第2季社区Task挑战赛升级新玩法,等你来战!

第1季都有哪些有趣的作品&#xff1f; 在大家的共建下&#xff0c;FISCO BCOS开源生态不断丰富完善&#xff0c;涌现了众多实用技术教程和代码&#xff1a;基于数字身份凭证的业务逻辑设计&#xff0c;贡献了发放数字身份凭证的参考实现&#xff1b;提供企业碳排放、慈善公益等…

linux4.0新增32位ARM的系统调用

修改内核源码 Linux系统为每一个系统调用赋予一个系统调用号。当应用程序执行一个系统调用时&#xff0c;应用程序就可以知道执行和调用到哪个系统调用了&#xff0c;从而不会造成混乱。系统调用号一旦分配之后就不会有任何变更&#xff0c;否则已经编译好的应用程序就不能运行…

10个牛逼的编程范式,你已经用过了几个?

《10个牛逼的编程范式&#xff0c;你已经用过了几个&#xff1f;》 编程范式是计算机编程中的基本思想和方法论&#xff0c;它描述了不同的编程风格和抽象层次。随着计算机科学的不断发展&#xff0c;编程范式也在不断演进和扩展&#xff0c;从最早的命令式编程到面向对象、声明…

VTK学习笔记(二十一)

显示立方体已经做过了&#xff0c;现在想简单处理一下立方体&#xff0c;比如每个面上增加一些文字。效果如下。 #include <vtkAnnotatedCubeActor.h> #include <vtkCamera.h> #include <vtkNamedColors.h> #include <vtkNew.h> #include <vtkPrope…

连续两年增收不增利,比亚迪电子靠新能源汽车业务再次起飞?

在净利润连续两年下挫之后&#xff0c;比亚迪电子&#xff08;00285.HK&#xff09;终于迎来了好消息。 不久前比亚迪电子发布2023年中期盈利预告显示&#xff0c;上半年净利润同比增加115%-146%&#xff08;2022年上半年的净利润显示6.34亿元&#xff09;。 这主要受益于大客…

H5 防止安卓手机软键盘弹出挤压页面导致变形的方法

一、问题&#xff1a; 在做移动端h5页面时&#xff0c;安卓端软键盘会导致页面压缩变形的问题&#xff1a;&#xff08;安卓端有问题&#xff0c;IOS端没问题&#xff09; 二、原因分析 安卓端&#xff1a;安卓中&#xff0c;如果将footer元素设置为position:fixed或absolute&…

FlashAttention

一、 论文题目&#xff08;发表处-时间&#xff09; FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness 二、主要方向 新型注意力机制 三、细化任务 一种具有 IO 感知&#xff0c;且兼具快速、内存高效的新型注意力算法 四、论文动机 一般对…

DQNs【Vanilla DQN Double DQN Dueling DQN】

DQNs 文章目录 DQNs1. DQN及其变种介绍1.1 Vanilla DQN1.2 Double DQN1.3 Dueling DQN 2. Gym环境介绍2.1 Obseravtion Space2.2 Reward Function2.3 Action Space 3. DQNs Code3.1 Vanilla DQN效果3.2 Double DQN效果3.3 Dueling DQN效果 Reference ​ 在 Reinforcement Lear…

14 | 菜品订单分析

本次研究将以菜品订单分析为主题,探讨如何从订单数据中获取有价值的见解。我们将借助数据分析技术,深入研究菜品的销售情况、客户的点餐偏好、订单的时间分布等方面,从而帮助餐厅更好地了解消费者需求,优化经营策略,提升客户体验。通过对菜品订单数据的深入分析,我们可以…

移动电子商务多用户B2B2C商城系统开发

多用户B2B2C商城pc端区块链应用开发的数据运营是为了更好地利用数据&#xff0c;提高商城的运营效率和用户体验。以下是数据运营的六个步骤&#xff1a; 数据采集 数据采集是数据运营的基础。在商城开发过程中&#xff0c;需要采集用户数据、交易数据、商品数据等。这些数据可…

APP备案明明是好事,为啥有些人反对呢?

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; APP和小程序备案&#xff0c; 这事在网上闹的沸沸扬扬&#xff0c;明明是好事&#xff0c;可为啥那么多人反对呢?而且最近出现了好多阴阳怪气的声音。 话说从2005年3月起&#xff0c;国内所有的网…

linux 查询后台任务及杀掉进程

查看后台任务命令 jobs -l删除后台进程命令 kill -9 28719