mysql优化案例分享

news2024/11/15 8:46:15

一、mysql介绍

1、InnoDB引擎

mysql5.5.8版本开始后。InnoDB引擎就是默引擎,本文介点也都是围绕该引擎展开

1聚集存

InnoDB引擎采用聚集存,即每表的存都是主行存放,也就是每行存的物理序和主键顺序相同,如果未指定主,引擎会表生成一个6字的rowid作。相于非聚集存,聚集存索引和数据

2 B+树索引

InnoDB引擎采用B+树索引,同样也是磁盘和存储工具设计的一种数据结构,它是一种平衡查找树,它在查找,插入、修改方面的时间复杂度都稳定为 O(logn)于平衡二叉点可以多个元素,因此整体可以存储较多的数据,并且的高度也会矮,可以减少磁IO,提高索效率。

注: 树结构,既有组结索的速度,又有改的速度

1.1、索引数据结构

按聚集存储方式的B+树索引数据结构如下

https://pic2.zhimg.com/v2-1fd6d8cd0dcc096f1a63da86233fc515_r.jpg

a、非叶子节点不存储data,只存储索引,且可以存储多个索引字段

b、叶子节点既存储data,也存储索引即主键,此时叶子结点覆盖所有数据

c、叶子节点用双向指针连接,提高区间访问的性能

总得来说,这个数据结构带来了空间和时间上成本,空间上每建立一个索引都要为它建立一棵 B+ 树,时间上每次对表中的数据进行增、删、改操作时,都需要去修改各个 B+ 树索引。

: 非聚集存储方式相对于聚集存储方式的最大区别,这里叶子节点存储的data变更为数据地址

1.2、索引适用条件

从1.1原理,可知一个索引一个B+树,那么索引天然是排序的、分组的。若非叶子存储多个索引字段,需遵循最左匹配原则。那么索引适用条件如下:

假设t_student表,主键为id,联合索引为idx_name_age

适用条件

参考原理

示例

全值匹配

索引检索

select * from t_student where name = 'zhangsan'

最左匹配

多个索引时,字段按顺序匹配

错误示例

select * from t_student where age >  18 and age< 30

范围值匹配

索引排序

select * from t_student where name >  'zhangsan' and name < 'lisi'

列前缀匹配

索引排序,例如字符串已经按字母排序好,此时只能匹配前缀

select * from t_student where name list 'zhang%'

排序匹配

索引排序

select * from t_student order by age

分组配置

索引分组

select * from t_student order by name

混合匹配

索引检索、索引排序

select * from t_student where name = 'zhangsan' and age > 18 and age < 30

: 任意条件仅限一个字段,即不能新增nick_name精确匹配或birthday范围匹配

1.3、索引失效场景

结合1.1和1.2,以及日常使用场景,总结索引失效场景如下:

假设t_student表,主键为id,联合索引为idx_name_age

失效场景

参考原理

示例

字段类型不匹配

索引检索

select * from t_student where age = 'zhangsan'

索引字段条件不匹配

索引检索(即or出现未索引字段)

select * from t_student where name = 'zhangsan' or nick_name = 'zs'

通配符不匹配

索引排序

同1.2

联合索引不匹配

多个索引时,字段按顺序匹配

同1.2

运算符不匹配

索引排序,仅支持大于、小于、等于

!= 、< >、not in、+、-、*、/、is null、is not null、字段比较

排序不匹配

索引排序

禁止使用asc、desc

通过explain语句判断索引是否生效

EXPLAIN SELECT * FROM table_name WHERE column_name = 'value';

示例1 and条件—索引命中,即如图key为命中索引

示例2 or条件—索引未命中,即如图key为空

2、锁

2.1、定义

锁是数据库系统区别于文件系统的一个关键特性。锁机制用于管理对共享资源的并发访问。

注:

这里的共享资源,不仅仅是行记录,还可以是表数据、操作缓冲池数据。

这里我们关注的锁是locklock的对象是事务,用来锁定的是数据库中的对象,如表、页、行。并且一般lock的对象仅事务commitrollback后进行释放。

2.2、锁类型

共享锁(S Lock): 允许事务读一行数据

排他锁(X Lock): 允许事务删除或更新一行数据

意向共享锁(IS Lock): 事务想要获得一张表中某几行的共享锁

意向排他锁(IX Lock): 事务想要获得一张表中某几行的排他锁

:

为了支撑在不同粒度(表、页)上加锁,并减少锁开销,引入意向锁,意向锁锁对某种资源的意向,可通过意向锁提前判断是否有冲突,减少遍历所有行锁的开销。

页是mysql的数据存储单位,SHOW VARIABLES LIKE 'innodb_page_size'可查看页大小

实践分享

考虑到select默认不加锁,而delete/update/insert默认加排他锁,可以通过lock in share mode主动加上S Lockfor update主动加上X Lock

监控可能存在的锁问题

select * from information_schema.INNODB_TRX;

select * from information_schema.INNODB_LOCKS;

select * from information_schema.INNODB_LOCKS_WAITS;

2.3、锁算法

Record Lock: 单个行记录上的锁

适用场景:sql语句查询条件字段仅主键索引

Gap Lock间隙锁定一个范,但不包含记录本身

适用场景:sql语句查询条件字段仅普通索引

: 插入意向锁(Insert Intention Locks),提高并发插入的性能,允许多事务在同一间隙内插入数据而不会相互阻塞

Next key Lock:锁定一个范围,但包含记录本身,默认算法

适用场景:sql语句查询条件字段既有主键索引又有普通索引

2.4、死锁定义

死锁上指两个或两个以上的事务在执行过程中,因争夺锁资源而造成的一种互相等待的现象。死锁概率与事务数量、每个事务的操作数量、每个事务操作的数据量息息相关,所以需要在业务上减少事务数量、每个事务的操作数量,扩大每个事务操作的数据量范围

3、事务

3.1、定义

事务同样是数据库区别于文件系统的重要特性,来保障事务里面所有操作ACID特性,即原子性、一致性、隔离性、持久性。

3.2、类型

默认事务类型READ REPEATABLE

4、设计规范

4.1、设计原则

a.基本原则

1、第一范式 即每个列遵循原子性 举例:人的多个属性不能都放在一列

2、第二范式 即每个表遵循模块化 举例:订单模块和产品模块分开,即同一张表只能依赖一个主键(或负荷主键)

3、第三范式 即每个列遵循冗余性 举例:单价和总价不应该同时出现,班级和老师不应该同时出现

总结:需求>性能>范式,为了性能/需求,该冗余还是得冗余;为了成本,至少遵循第三范式

b.进阶原则(单表数据量过大怎么解决)

4.2、阿里建表规范

1.【强制】表达是与否概念的字段,必须使用is_xxx的方式命名,数据类型是unsigned tinyint(1表示是,0表示否),此规则同样适用于odps建表。

说明:任何字段如果为非负数,必须是unsigned。

2.【强制】表名、字段名必须使用小写字母或数字;禁止出现数字开头,禁止两个下划线中间只 出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。

正例:getter_admin,task_config,level3_name

反例:GetterAdmin,taskConfig,level_3_name

3.【强制】表名不使用复数名词。

说明:表名应该仅仅表示表里面的实体内容,不应该表示实体数量,对应于DO类名也是单数形式,符合表达习惯。

4.【强制】禁用保留字,如desc、range、match、delayed等,参考官方保留字。

5.【强制】唯一索引名为uk_字段名;普通索引名则为idx_字段名。 说明:uk_即unique key;idx_即index的简称。

6.【强制】小数类型为decimal,禁止使用float和double。

说明:float和double在存储的时候,存在精度损失的问题,很可能在值的比较时,得到不正确的结果。如果存储的数据范围超过decimal的范围,建议将数据拆成整数和小数分开存储。

7.【强制】如果存储的字符串长度几乎相等,使用CHAR定长字符串类型。

8.【强制】varchar是可变长字符串,不预先分配存储空间,长度不要超过5000,如果存储长度大于此值,定义字段类型为TEXT,独立出来一张表,用主键来对应,避免影响其它字段索引效率。

9.【强制】表必备三字段:id, gmt_create, gmt_modified。

说明:其中id必为主键,类型为unsigned bigint、单表时自增、步长为1;gmt_create, gmt_modified的类型均为date_time类型。

10.【推荐】表的命名最好是加上“业务名称_表的作用”。

正例:tiger_task / tiger_reader / mpp_config

11.【推荐】库名与应用名称尽量一致。

12.【推荐】如果修改字段含义或对字段表示的状态追加时,需要及时更新字段注释。

13.【推荐】字段允许适当冗余,以提高性能,但是必须考虑数据同步的情况。冗余字段应遵循:

1)不是频繁修改的字段。

2)不是varchar超长字段,更不能是text字段。

正例:各业务线经常冗余存储商品名称,避免查询时需要调用IC服务获取。

14.【推荐】单表行数超过500万行或者单表容量超过2GB,才推荐进行分库分表。

说明:如果预计三年后的数据量根本达不到这个级别,请不要在创建表时就分库分表。

15.【参考】合适的字符存储长度,不但节约数据库表空间、节约索引存储,更重要的是提升检索速度。

正例:人的年龄用unsigned tinyint(表示范围0-255,人的寿命不会超过255岁);海龟就必须是smallint,但如果是太阳的年龄,就必须是int;如果是所有恒星的年龄都加起来,那么就必须使用bigint

5、案例分享

5.1、慢查询

开启慢查询日志

[mysqld]

slow_query_log = 1

slow_query_log_file = /path/to/mysql-slow.log

#单位秒

long_query_time = 0.1

模拟慢查询

第一步 批量插入100万条数据

第二步 以未加索引字段nick_name为条件进行查询

慢查询日志示例

Time                 Id Command    Argument

# Time: 2024-08-20T04:43:20.250382Z

# User@Host: root[root] @ localhost [::1]  Id:     2

# Query_time: 0.537167  Lock_time: 0.017117 Rows_sent: 0  Rows_examined: 1000000

use food_db;

SET timestamp=1724129000;

SELECT * FROM t_student where nick_name = 'aaa'

LIMIT 0, 10;

5.2、死锁

模拟死锁

会话1

begin;

//排它锁

select * from t_student where id=4 for update;

//产生死锁

insert into t_student values(3,’test’,18)

会话2

begin;

//共享锁

select * from t_student where id<=4 lock in share mode;

--等待

提示:ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

查询死锁情况

select * from information_schema.INNODB_LOCKS;

lock_data是主键记录,lock_page是页序号,lock_rec是记录序号

: mysql8.0版本后,可使用select * from performance_schema.data_locks

6、参考书籍

《MySQL技术内幕  InnoDB存储引擎  第2版》

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

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

相关文章

基于SparkGraphX实现带权重的PageRank算法

基于SparkGraphX实现带权重的PageRank算法 文章目录 基于SparkGraphX实现带权重的PageRank算法一、什么是PageRank算法二、PageRank算法的实现三、PagRank算法实现步骤四、大数据量的PageRank算法实现总结 一、什么是PageRank算法 网页排序算法之PageRank 二、PageRank算法的…

【AI视频】Runway注册、基本设置、主界面详解

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AI视频 | Runway 文章目录 &#x1f4af;前言&#x1f4af;Runway的正确启动方式推荐使用Google Chrome打开Chrome翻译 &#x1f4af;Runway的注册&#x1f4af;My Account&#xff08;我的账户&#xff09;General&#xff08;常…

HTTPie CLI:重塑命令行HTTP交互的现代工具

更多内容前往个人网站&#xff1a;孔乙己大叔 在快速发展的数字时代&#xff0c;API&#xff08;应用程序编程接口&#xff09;已成为连接不同服务和应用的桥梁。无论是开发者还是系统管理员&#xff0c;与HTTP服务进行有效且高效的交互都是日常工作的核心部分。然而&#xff0…

idea中git提交或push到远程后回退到之前的某次提交简单有效的解决方案

场景&#xff1a; 1、先模拟出团队多人开发多分支&#xff0c;在各个分支分别提交代码&#xff0c;然后都合并到master分支 2、模拟如下两个分支dev、dev-0902合并到master&#xff0c;并且合并master后push到远程了 3、假如更新版本计划有变&#xff0c;只上dev-0902分支&…

stm32之I2C通信外设

系列文章目录 1. stm32之I2C通信协议 2. stm32之软件I2C读写MPU6050陀螺仪、加速度传感器应用案例 3. stm32之硬件I2C读写MPU6050陀螺仪、加速度传感器应用案例 文章目录 系列文章目录前言一、I2C通信外设1.1 I2C外设简介1.2 软件模拟和硬件外设对比 二、I2C外设电路结构2.1 I…

【数据结构-二维前缀异或和】【分区算法优化】力扣1738. 找出第 K 大的异或坐标值

给你一个二维矩阵 matrix 和一个整数 k &#xff0c;矩阵大小为 m x n 由非负整数组成。 矩阵中坐标 (a, b) 的 目标值 可以通过对所有元素 matrix[i][j] 执行异或运算得到&#xff0c;其中 i 和 j 满足 0 < i < a < m 且 0 < j < b < n&#xff08;下标从 …

IP网络广播系统(IP网络广播系统是什么及它的优势与应用)

一、引言 在当今数字化的时代&#xff0c;音频传播技术也在不断革新。IP网络广播系统作为一种先进的音频传输解决方案&#xff0c;正逐渐在各个领域发挥重要作用。那么&#xff0c;究竟什么是IP网络广播系统呢&#xff1f;它又有着怎样独特的优势和广泛的应用呢&#xff1f;本…

1、Django Admin学习模型

此专栏应用环境和模型基于此文 开发环境 系统&#xff1a;windows11 开发工具&#xff1a;vscode 开发语言&#xff1a;python 3.8 开发框架&#xff1a;django 3.2 数据库&#xff1a;mysql8.4.1 项目目录 settings 注册两个应用 INSTALLED_APPS [django.contrib.ad…

免下载看视频,使用极空间部署P2P磁力种子流媒体服务器『TorrServer』

免下载看视频&#xff0c;使用极空间部署P2P磁力种子流媒体服务器『TorrServer』 哈喽小伙伴们好&#xff0c;我是Stark-C~ 说到在NAS上的观影体验&#xff0c;很多小伙伴的理解可能就是先下载到本地&#xff0c;然后在使用播放器打开观看。今天为大家分享另外一种观影方式&a…

JS设计模式之“语言之魂” - 原型模式

前言 当我们学习JavaScript的时候&#xff0c;经常会听到原型&#xff08;prototype)、原型链&#xff08;prototype chain&#xff09;和原型模式&#xff08;prototype pattern&#xff09;这些概念&#xff0c;它们之间有什么关联呢&#xff1f;怎么样才能使用好原型模式呢…

linux 硬件 arm架构

一.ARM&#xff1a; 1.时钟晶振&#xff1a; 在单片机系统里晶振的作用非常大&#xff0c;他结合单片机内部的电路&#xff0c;产生单片机所必须的时钟频率&#xff0c;单片机的一切指令的执行都是建立在这个基础上的&#xff0c;晶振的提供的时钟频率越高&#xff0c;那单片机…

Valley14.2免授权php跨境电商在线商城

6Valley 14.2 Nulled – 多供应商电子商务 – 完整的电子商务移动应用程序、Web、卖家和管理面板 后台可自定义收款&#xff0c;和翻译多国语言&#xff0c;中文需要自己对比翻译&#xff01;一般用不到中文。毕竟是跨境电商平台 带商家即时通讯&#xff0c;全套带文档和APP双端…

DReg-NeRF: Deep Registration for Neural Radiance Fields论文解读

目录 一、导言 二、NeRF2NeRF 三、相关工作 1、神经辐射场 2、点云配准 3、NeRF配准 四、DReg-NeRF 1、NeRF神经辐射场查询 2、特征提取 3、transformer 4、Decoder 五、损失函数 一、导言 该论文来自于ICCV2023&#xff0c;主要提到一种DReg-NeRF的配准方法&#…

SQL 数据查询

文章目录 3.4.1 单表查询定义特点单表无条件查询单表带条件查询对查询结果进行排序限制查询结果数量 3.4.2 分组查询定义特点&#xff1a;聚集函数GROUP BY短语HAVING子句分组查询小结 3.4.3 连接查询定义特点&#xff1a;等值连接与非等值连接查询自然连接&#xff08;内连接&…

全局安装react

1、首先安装react脚手架 npm install -g create-react-app2、创建react项目 create-react-app my-app3、 PS D:\桌面\papers\subject> create-react-app my-react-appCreating a new React app in D:\桌面\papers\subject\my-react-app.Installing packages. This might …

基于vue框架的超市订单管理系统16uob(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;员工,商品分类,商品信息,供货商,入库订单,销售订单,货架信息,盈利信息 开题报告内容 基于Vue框架的超市订单管理系统开题报告 一、研究背景与意义 随着信息技术的飞速发展和电子商务的普及&#xff0c;传统超市管理模式正面临前所未有…

wsl2 安装qt5

sudo apt-get install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools qtcreator -ysudo apt-get install build-essential libfontconfig1 mesa-common-dev -y "qt5-default"从Ubuntu 21.04 存储库中就缺少了该软件包&#xff0c;后续会不会添加暂时未知。 在…

SpringBoot日志使用:Slf4j与Logback

步骤一&#xff1a;引入lombok即可&#xff0c;lombok自带Slf4j注解&#xff08;网上说不用引入api的依赖&#xff0c;若报错可添加&#xff09; <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version&…

数据访问:JPA

文章目录 JPA的由来JPA是什么Spring Data JPA快速上手 JPA的由来 ORM框架能够将Java对象映射到关系型数据库中&#xff0c;能够直接持久化复杂的 Java对象。ORM框架的出现&#xff0c;可以让开发者从数据库编程中解脱出来&#xff0c;把更多的精力放在业务模型与业务逻辑上。目…

Open3D 计算投影的点云的尺寸

目录 一、概述 1.1实现步骤 1.2应用场景 二、代码实现 三、实现效果 3.1原始点云 3.2投影后点云 Open3D点云算法汇总及实战案例汇总的目录地址&#xff1a; Open3D点云算法与点云深度学习案例汇总&#xff08;长期更新&#xff09;-CSDN博客 一、概述 在 Open3D 中&…