MySql进阶 锁 优化 | DAY 15

计算机协调多个进程或线程并发访问某一种资源的机制

粒度

  • 全局锁 锁住数据库中所有表
  • 表级锁 锁住整张表
  • 行级锁 锁住对应行数

全局锁

锁后 只能进行读取 全库的数据备份 从而获取一致性视图

全局锁 flush tables with read lock;

备份 mysqldump -u root -p 12345 database_name > xxx.sql;(在windows命令行执行)

解锁 unlock tables ;

在innodb引擎中 备份添加参数 --sing-transaction完成不加锁的一致性备份

表级锁

每次操作锁住整张表

  • 表锁
  • 元数据锁
  • 意向锁

表锁

  • 表共享读锁 所用客户端只能读
  • 表独占写锁 其他客户端读写都被阻塞

加锁 lock tables table_name read/write

释放锁 unlock tables

元数据锁

系统自动控制加锁 维护表元数据的数据一致性 在表上有活动事务的时候 不可以对元数据进行写入操作

当对表进行增删改查的时候 自动加锁

意向锁

解决在执行dml语句中 加的行锁与表锁的冲突 在innodb引擎加入了意向锁 是的表锁不用检查每行数据是否加锁 使用意向锁来减少表锁的检查

  • 意向共享锁(IS) select…lock in share mode(添加行锁共享锁)
  • 意向排他锁 (IX)insert update delete select…for update

兼容问题

**意向共享锁:**与表锁共享锁(read)兼容 与表锁排他锁(write)互斥

**意向排他锁:**与表锁共享锁(read)以及排他锁(write)都互斥 意向锁之间不会互斥

行级锁

锁住对应数据行的数据

行锁是通过对索引上的索引行加锁来实现的而不是对记录加的锁

  • 行锁 锁定单行数据 防止其他事务对此进行update和delete
  • 间隙锁 锁定索引记录的间隙(不含该记录)确保索引记录间隙不变 防止其他事务在这个间隙进行insert 产生幻读 在RR隔离级别下都支持
  • 临建锁 行锁和间隙锁组合 同时锁住数据并锁住数据前面的间隙

行锁

  • 共享锁(S)允许一个事务读取一行 阻止其他事务获得相同数据集的排他锁
  • 排他锁(X)允许获取排他锁的事务更新数据 阻止其他事务获取相同数据集的共享锁和排他锁
sql行锁类型说明
insert排他锁自动
update排他锁自动
delete排他锁自动
select不加锁
select…lock in share mode共享锁手动
select…for update排他锁手动

间隙锁

默认情况下 innodb在repeatable read事务隔离级别运行 innodb使用next-key进行搜索和索引扫描 以防止幻读

  1. 索引上的等值查询(唯一索引)给不存在的记录加锁时 优化为间隙锁
  2. 索引上的等值查询(普通索引) 向右遍历时最后一个值不满足查询需求时 临建锁退化为间隙锁
  3. 索引上的范围查询(唯一索引)会访问到不满足条件的第一个值为止

间隙锁唯一目的是防止其他事务插入间隙 间隙锁可以共存 一个事务采用的间隙锁不会组织两一个事务在同一个间隙上采用间隙锁

MySQL管理

系统数据库

mysql

存储正常运行的各种信息

information_schema

元数据体系 数据库 表 字段类型及访问权限

performance_schema

为服务器运行时提供了一个底层监控的功能 主要用于收集服务器性能参数

sys

包含了一系列方便dba和开发人员利用performance_schema 性能数据库进行性能调优和诊断

常用工具

-u 指定用户名
-p 指定密码
-h 指定服务器ip或域名
-P 指定连接端口号
-e 执行sql语句并退出(可以在客户端执行sql语句 而不用连接数据库)

mysqladmin

执行管理操作的客户端程序 可以用它检查服务器的配置和当前状态 创建并删除数据库等

不指定主机名和端口号 默认本主机3306

mysqlbinlog

服务器生成的二进制文件 需要用到mysqlbinlog管理工具

mysqlbinlog [options] log-files...

-d 指定数据库名称
-o 忽略日志中前n行的命令
-r 将输出的文本格式日志输出到指定文件
-s 显示简单个事 省略一些信息

SQL优化

插入数据

insert优化

批量插入

insert into table-name values(1,'tom),(2,'cat)...;

手动事务提交

start transction;

commit

主键顺序插入

大批量数据插入

load指令

  1. 客户端连接服务端时 添加参数 --local-infile
  2. 设置全局参数 set global local_infile=1
  3. 执行load指令 将准备好的数据加载到表结构中去 load data local infile 'filename.log' into table 'table_name' fields terminated by ',' lines terminated by '\n';

主键优化

主键设置原则

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

order by优化

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

需要为排序的字段创建索引

create index index_name on table_name(字段1,字段2)

注意创建字段索引的顺序要与排顺时字段顺序相同 (最左前缀法则)

默认升序排序 asc 降序排序 desc

创建字段索引时可以指定升序降序

如果全部字段遵循一致的排列顺序 则不需要额外指定字段排序

group by优化

出现 using temporary 临时表 效率极低

创建联合索引 注意最左前缀法则

where 先出现group by后出现 依旧可以满足最左前缀法则

limit优化

分页查询

大数据量分页 越往后 耗时越长

优化 覆盖索引 子查询

//例子
select * from table_name limit 9000000,10;
//优化
select *from table_name where id in(select id from table_name order by id limit 9000000,10);
//或者
select name1.* from table_name1 name1,(select * from table_name order by id limit 9000000,10) name2 where name1.id=name2.id;

count 优化

myisam 引擎会把一个表的总行数存在磁盘上 执行count *效率高

innodb 执行count* 时 需要把数据一行一行地从引擎里读出来 然后累计计数

优化思路:自己计数 自己维护

count几种方式

  • count 主键

    • innodb会遍历整张表 每一行的主键提取出来 返回给服务层 服务层进行累加
  • count 字段

    • 没有not null 约束 遍历整张表的每一行的字段返回给服务层 判断是否为null
    • 有约束 每一行提取出来返回给服务层 直接按行累加
  • count *

    • 不取值直接累加
  • count 1

    • 遍历整张表 不取值 放数字进去后直接按行进行累加

count *效率最高 count 1 count主键 count字段

update 优化

update 条件中没有使用索引的话 会锁住整张表

innodb是针对索引加的锁 不是针对记录加锁 并且索引不能失效 否则行锁升级为表锁

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

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

相关文章

Express学习(三)

Express中间件 中间件的概念 什么是中间件 中间件,特指业务流程的中间处理环节。Express中间件的调用流程 当一个请求到达Express的服务器之后,可以连续调用多个中间件,从而对这次请求进行预处理。类似于下图所示 Express中间件的格式 Expr…

内联函数|auto关键字|范围for的语法|指针空值

文章目录 一、内联函数1.1概念1.2特性 二、auto关键字2.2类型别名思考2.3auto简介2.4auto使用细则2.4 auto不能推导的场景 三、基于范围的for循环(C11)3.1 范围for的语法 四、指针空值nullptr(C11)4.1 C98中的指针空值 所属专栏:C初阶 一、内联函数 1.1概念 以inline修饰的函…

【LeetCode】升级打怪之路 Day 16:二叉树题型 —— 二叉树的构造

今日题目: 654. 最大二叉树105. 从前序与中序遍历序列构造二叉树106. 从中序与后序遍历序列构造二叉树889. 根据前序和后序遍历构造二叉树 目录 LC 654. 最大二叉树 【easy】 Problem:根据遍历序列来还原二叉树 【classic】 ⭐⭐⭐⭐⭐LC 105. 从前序与中…

小程序 获取 手机号 47001 data format error hint

0.场景 后端获取小程序用户手机号 ,api文档 https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-info/phone-number/getPhoneNumber.html 使用hutool工具作为http client 1. 正确的写法 正确示例 String tencentUrl StringUtils.format("https://api…

C++vector的使用方法

文章目录 一、vector的介绍1. 文档链接2. 简要介绍 二、vector的使用1.vector的定义(1)构造函数(2)拷贝构造函数(2)赋值重载 2. vector 增删查改(1)operator [](2&#x…

[HackMyVM]靶场 Quick3

kali:192.168.56.104 主机发现 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 0a:00:27:00:00:05 (U…

树状数组+离散化求逆序对超详细讲解!

树状数组离散化求逆序对 用一个数组 w [ ] w[] w[]来记录遍历到当前数时,每个数出现的次数 由于只关心每个数前边有多少个数比他大,遍历到 i i i时,求大于 a [ i ] a[i] a[i]的数有多少个,就是对 [ a [ i ] , n ] [a[i], n] [a[i…

HTML—常用标签

常用标签&#xff1a; 标题标签&#xff1a;<h1></h1>......<h6></h6>段落标签&#xff1a;<p></p>换行标签&#xff1a;<br/>列表&#xff1a;无序列表<ul><li></li></ul> 有序列表<ol>&…

她们正在影响AI进程

今天是3月8日&#xff0c;祝广大女性同胞节日快乐&#xff01; 当下&#xff0c;人工智能正是全球科技圈最受关注的领域&#xff0c;甚至没有之一。 在人工智能领域诞生兴起的几十年内&#xff0c;女性科学家作为重要力量&#xff0c;一直在推动行业不断向前发展。 从基础算…

详谈数据结构数组名的含义

谈及背景 int a[3]; sizeof(arr) 12B &#xff0c;这个让我很不理解&#xff0c;后来通过一系列调查研究出了sizeof 一些性质: sizeof()是单目运算符&#xff0c;和‘’一样&#xff0c;不是库函数。sizeof()算结构体的大小 有对应的规则 算结构体大小与结构体中成员排列的顺序…

c++ primer中文版第五版作业第十八章

仓库地址 文章目录 18.118.218.318.418.518.618.718.818.918.1018.1118.1218.1318.1418.1518.16位置一using声明 位置二using声明 位置一using指示 位置二using指示 18.1718.1818.1918.2018.2118.2218.2318.2418.2518.2618.2618.2818.2918.30 18.1 此时r是一个range_error类型…

并查集(蓝桥杯 C++ 题目 代码 注解)

目录 介绍&#xff1a; 模板&#xff1a; 题目一&#xff08;合根植物&#xff09;&#xff1a; 代码&#xff1a; 题目二&#xff08;蓝桥幼儿园&#xff09;&#xff1a; 代码&#xff1a; 题目三&#xff08;小猪存钱罐&#xff09;&#xff1a; 代码&#xff1a; …

WebGL之使用着色器将颜色应用于 WebGL

在之前的展示中我们已经创建好了一个正方形&#xff0c;接下来我们要做的就是给它添加一抹色彩。添加颜色可以通过修改着色器来实现。 给顶点着色 在 WebGL 中&#xff0c;物体是由一系列顶点组成的&#xff0c;每一个顶点都有位置和颜色信息。在默认情况下&#xff0c;所有像…

异常-Exception

文章目录 异常-Exception常见的运行时异常NullPointerException&#xff08;空指针异常&#xff09;ArithmeticException&#xff08;数学运算异常&#xff09;ArrayIndexOutOfBoundsException&#xff08;数组下标越界异常&#xff09;ClassCastException&#xff08;类型转换…

Basis运维日常检查清单- Checklist

检查SYSTEM 是否正常GUI登入登入到系统检查所有应用服务器是否活动正常SM51检查所有SAP Instance服务器运行是否正常.检查工作进程进行SM50检查是否有运行时间很长Local ProcessSM66检查是否有运行时间很长Global Process检查陈旧锁定条目SM12在User ID栏输入*. 检查前期的锁列…

网络编程聊天室

客户端 #include <myhead.h> //创建结构体存储用户信息 struct User {char tape;char username[32];char msg[1024]; };int main(int argc, const char *argv[]) {//创建套接字与服务器进行通信int sfdsocket(AF_INET,SOCK_STREAM,0);if(sfd-1){perror("socket err…

鸿蒙实战开发Camera组件:【相机】

相机组件支持相机业务的开发&#xff0c;开发者可以通过已开放的接口实现相机硬件的访问、操作和新功能开发&#xff0c;最常见的操作如&#xff1a;预览、拍照和录像等。 基本概念 拍照 此功能用于拍摄采集照片。 预览 此功能用于在开启相机后&#xff0c;在缓冲区内重复采集…

django默认后台管理显示内容深化设置

1、设置models字段展示为只读模式 如某个字段在展示时不允许修改&#xff0c;可在admin.py的注册类下重写函数get_readonly_fields&#xff0c;例&#xff1a; def get_readonly_fields(self, request, objNone): return (dwdm,dwmc,"zjs","yyj"…

ARC-Challenge数据集分享

来源: AINLPer公众号&#xff08;每日干货分享&#xff01;&#xff01;&#xff09; 编辑: ShuYini 校稿: ShuYini 时间: 2024-2-28 该数据集由Allen Institute for Artificial Intelligence&#xff08;AI2&#xff09;发布&#xff0c;旨在推动高级问答的研究。该数据集包含…

#微信小程序(按键控制)

1.IDE&#xff1a;微信开发者工具 2.实验&#xff1a;微信小程序设计两个按钮&#xff0c;对onenet平台数据流&#xff08;旧版&#xff09;来进行http post上传&#xff0c;下位机再http get得到控制信息 3.记录 &#xff08;1&#xff09;bind-tap&#xff08;绑定函数&…