服务端持久化层MySQL零基础入门实战1

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 服务端持久化层MySQL零基础入门实战

1.MySQL入门

1.1.源码安装MySQL5.7

1、关闭防火墙、selinux

systemctl stop firewalld.service
vi /etc/selinux/config 
更改 SELINUX=disabled

2、安装cmake工具

yum -y install cmake

3、解压boost压缩包(mysql5.1.17必须依赖)

tar -xf boost_1_59_0.tar.gz

4、yum安装其他组件

yum -y install gcc gcc-c++ bzip2 bzip2-devel bzip2-libs python-devel ncurses ncurses-devel openssl-devel

5、创建mysql程序用户

useradd -M -s /sbin/nologin mysql

6、创建mysql安装路径,数据文件路径,并授权

安装路径:mkdir -p /usr/local/mysql
数据文件路径:mkdir -p /usr/local/mysql/data
授权:chown -R mysql:mysql /usr/local/mysql /usr/local/mysql/data

7、使用cmake工具对mysql5.7.17进行环境收集检验于配置相关模块

#解压mysql源码包,并进入解压后的路径 (注意:cmake之前一定要解压boost_1_59_0.tar.gz)
tar -xf mysql-5.7.17.tar.gz
cd mysql-5.7.17
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql/ \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DSYSCONFDIR=/etc \
-DMYSQL_USER=mysql \
-DMYSQL_TCP_PORT=3306 \
-DWITH_XTRADB_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DMITH_READLINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_EXTRA_CHARSETS=1 \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DEFAULT_CHARSET=all \
-DWITH_BIG_TABLES=1 \
-DWITH_BOOST=../boost_1_59_0 \
-DWITH_DEBUG=0
参数详细信息解释:
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ #指定mysql数据库安装目录
-DMYSQL_DATADIR=/data/mydata \        #指定数据库文件路径
-DSYSCONFDIR=/etc \             #指定配置文件目录
-DWITH_INNOBASE_STORAGE_ENGINE=1 \      #安装INNOBASE存储引擎
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \       #安装ARCHIVE存储引擎 
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \     #安装BLACKHOLE存储引擎 
-DWITH_READLINE=1 \             #使用readline功能 
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \     #连接文件位置
-DWITH_SSL=system \             #表示使用系统上的自带的SSL库 
-DWITH_ZLIB=system \            #表示使用系统上的自带的ZLIB库 
-DDEFAULT_CHARSET=utf8 \          #指定默认使用的字符集编码 
-DDEFAULT_COLLATION=utf8_general_ci \   #指定默认使用的字符集校对规则 
-DDOWNLOAD_BOOST=1 \
-DWITH_BOOST=../boost_1_59_0 \        #指定Boost库的位置,mysql5.7必须添加该参数 
-DENABLE_DOWNLOADS=1            #支持下载可选文件

c9dc6ae6742142faa4a81f7fa16e7689.jpg

编译完成警告忽略,如果出现报错删除mysql安装包下的CMakeCache.txt文件

8、编译并安装(此步时间过长,可以来把王者压压惊)

make && make install

9、编译并安装

/usr/local/mysql/bin/mysqld \
--initialize \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data \
-socket=/tmp/mysql.sock

10、修改my.cnf配置文件

vi /etc/my.cnf
[mysqld]
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
symbolic-links=0
[mysqld_safe]
log-error=/usr/local/mysql/log/mysql.errlog
pid-file=/usr/local/mysql/data/$hostname.pid

11、创建错误日志文件,并将文件归属到mysql程序用户下

touch /usr/local/mysql/log/mysql.errlog
chown -R mysql:mysql /usr/local/mysql/log/mysql.errlog

注意:如果配置文件里面配置了,某个文件一定要在启动前提前创建好,否则会报错

Starting MySQL.2019-08-03T14:19:37.028727Z mysqld_safe error: log-error set to '/usr/local/mysql/log/mysql.errlog', however file don't exists. Create writable for user 'mysql'. ERROR! The server quit without updating PID file (/data/mydata/localhost.localdomain.pid).

12、初始化数据库

mysql_install_db --user=mysql --datadir=/usr/local/mysql/data


bf6cc57ef69c466a860fe7a9fbbe8c1d.jpg

13、创建软链接

ln -s /usr/local/mysql/bin/* /usr/bin/

14、启动mysql服务

/usr/local/mysql/support-files/mysql.server start

15、停止mysql服务

/usr/local/mysql/support-files/mysql.server stop

16、登入mysql服务

mysql -uroot -p
设置密码:set password=password('123456');

1.2.Docker安装MySQL5.7

1、查看centos内核版本

uname -a


4c7c542f8bb8461aa3df0675150a5616.jpg

  • 安装条件:docker官方至少要求3.8,建议3.10以上

2、安装Docker的前期准备

(1)关闭防火墙

systemctl stop firewalld

1eef91705bab42b9a33daf46d6c251e3.jpg

(2)关闭selinux

vi /etc/selinux/config   --->将SELINUX=disabled


0059215a06384bc8b696b0e038762726.jpg

(3)安装wget命令

yum -y install wget

(4)下载阿里云docker社区版yum源

cd /etc/yum.repos.d/  进入到yum源的路径
wget  http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

(5)下载网络源安装contain-SElinux包

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
yum -y update #这一块时间有点长,耐心等待
  • 注意:一定要有这一步,否则会报找不到selinux包


7557b333d0674ced84b44c9a3c1682f2.jpg

(6)安装docker ce社区版

yum -y install docker-ce.x86_64


527b5b7b9fd943dd8595149006baed42.jpg

(7)设置开机自启

systemctl enable docker

(8)更新xfsprogs

yum -y update xfsprogs

3、启动docker容器

systemctl start docker

4、查看docker版本和详细信息

(1)查看docker版本

docker version

(2)查看docker详细信息

docker info

5、配置阿里云镜像加速

  • 新建文件:vi /etc/docker/daemon.json
  • 编辑文件
{
  "registry-mirrors": ["https://6j96rs65.mirror.aliyuncs.com"]
}
  • 重启docker
  • systemctl daemon-reload
  • systemctl restart docker
  • 查看容器独有的IP地址
  • docker inspect --format=‘{{.NetworkSettings.IPAddress}}’ 容器名|容器ID

6、拉取mysql:5.7镜像

docker pull mysql:5.7

7、启动MySQL5.7容器

docker run -p 3306:3306 --name mysql \ 
-v /usr/local/docker/mysql/conf:/etc/mysql \ 
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7
docker run #启动一个容器 
--name mysql #设置容器名称为mysql 
-p 3306:3306 #宿主机端口:容器内部端口, 将容器的mysql服务端口映射给宿主机的一个端口,对外提供 访问
-v /usr/local/docker/mysql/conf:/etc/mysql #挂载映射,将容器内部的/etc/mysql文件挂载载 宿主机的/usr/local/docker/mysql/conf目录下,其他同理 
-e MYSQL_ROOT_PASSWORD=123456 #-e设置额外的参数,设置root用户的密码 
-d #后台运行 
mysql:5.7 #镜像名称

8、docker ps查看MySQL容器运行状态

docker ps


77640aa31d734b5bb8b7e55e1dff0bbc.jpg

1.3.忘记MySQL超户密码

1、源码服务mysql忘记超户密码

(1)暂停 mysq服务

systemctl stop mysql  #或者/etc/init.d/mysqld start

(2)跳过 grant表授权,进入安全模式,并在后台运行

mysqld_safe --skip-grant-tables &

(3)进入安全模式修改密码

[root@mysql ~]# mysql
mysql> use mysql;
Database changed
mysql> update user set Password=password('123456') where user='root';
Query OK, 3 rows affected (0.00 sec)
Rows matched: 4    Changed: 3     Warnings: 0
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> exit
Bye

(4)重启mysql服务

systemctl start mysql #或者/etc/init.d/mysqld restart
mysql -uroot -p123456

2、容器服务mysql忘记超户密码

(1)进入容器内部

docker exec -it mysql bash

(2)设置跳过权限表的加载,注意这块表示任何用户都能登进来,非常不安全

echo "skip-grant-tables" >> /etc/mysql/conf.d/docker.cnf


b83e9442acc547f1b5615ae5b5347df9.jpg

(3)退出容器,重启容器

1.exit
2.docker restart mysql

(4)再次进入容器

docker exec -it mysql bash

(5)登录mysql(无需密码)

mysql -uroot


e3c6b81f23a34f2b9891b8472bd47476.jpg

(6)更新权限,修改密码,退出,替换掉刚才加的跳过权限表的加载参数

1.flush privileges;
2.alter user 'root'@'localhost' identified by '123456';
(或者:update user set password=password('123456') where user ='root')
3.exit
4.sed -i "s/skip-grant-tables/ /" /etc/mysql/conf.d/docker.cnf

1f17c8bb19654f0b848b5519a58d6aa3.jpg

(7)退出容器,重启容器

1.exit
2.docker restart mysql


49dff528ed43410a9a548742962a7e04.jpg

1.4.MySQL支持简体中文

1、临时开启mysql支持简体中文

6f3b5ed8994d4167ab76041bd5e9efcc.jpg

2、永久开启mysql支持简体中文

(1)源码mysql服务

  • 修改/etc/my.cnf配置文件
vi /etc/my.cnf
加如下内容:
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

(2)容器mysql服务

  • 进入容器内部,修改配置文件
1.docker exec -it mysql(容器名) bash
2.vim /etc/mysql/conf.d/docker.cnf
加如下内容:
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

2.MySQL数据库操作

2.1.SQL语句概述

  • SQL语句是(Structured Query Language)的缩写,是关系型数据库的标准语言,用于维护管理数据库,如数据查询、数据更新、访问控制、对象管理等功能。
  • SQL分类:
  • DDL:数据定义语言,用于增删改数据库的对象。
  • DML:数据操作语言,用于对表数据的增删改。
  • DQL:数据查询语句,用于数据查询。
  • DCL:数据控制语句。

2.2.数据库表的管理操作

1、查看数据库结构

查看数据库结构:
show databases;

3d7aa0c4c42a415c9e412f380beb45bb.jpg

查看数据库中的数据表信息:
use 数据库名;  #使用数据库
show tables;  #查看当前库下的所有表

a8d14cbfaedf40329df24b08e7d988d8.jpg

显示数据表的结构:
describe 数据库.表名
describe mysql.user; (或者desc user)

3bf68410ac4149c9b1175635c73872d5.png

2、DDL语句操作

数据定义语言,用于增删改数据库对象。

(1)create创建新库、创建新表

创建test库:
create database test;
创建test表:
create table test (id int(10) not null);

(2)drop删除库、删除表

删除test库:
drop database test;
删除test表:
drop table test;

3、DML语句表数据操作

数据操作语言,用于对表中的数据进行增删改。

(1)insert插入新数据

insert into 表名(字段1,字段2,....) values ('字段1的值','字段2的值',.....);
示例:
INSERT INTO sys.sys_config
(variable, value, set_time, set_by)
VALUES('diagnostics.include_raw', 'OFF', '2021-11-01 14:43:22.0', NULL);

(2)update更改原有的数据

update 表名 set 字段1 = 值1,.... where 表达式条件;
示例:
UPDATE sys.sys_config
SET value='OFF', set_time='2021-11-01 14:43:22.0', set_by=NULL
WHERE variable='diagnostics.include_raw';

(3)delete删除不需要的数据

delete from 表名 where 表达式条件;
示例:
DELETE FROM sys.sys_config
WHERE variable='diagnostics.include_raw';

4、DQL语句操作

数据查询语句,用于数据库的查询。

  • select查询语句
select 字段名1,字段名2,.... from 表名;
select 字段名1,字段名2,.... from 表名 where 表达式条件;
示例:
SELECT variable, value, set_time, set_by
FROM sys.sys_config
WHERE variable='diagnostics.include_raw';

2.3.用户权限设置

1、设置用户权限(用户不存在则新建用户)

grant 权限 on 库名.表名 to 'root'@'localhost' IDENTIFIED BY '123456';
grant all on *.* to 'root'@'localhost' IDENTIFIED BY '123456';
all #代表所有权限
on  #作用在那个库那些表中
*.* #第一个*代表所有的库第二个*代表所有的表
to 'root'@'localhost' #作用在本地的root用户上
IDENTIFIED BY '123456' #设置密码
grant select on mysql.* to 'lixiang'@'localhost' IDENTIFIED BY '123456';
#将mysql库的所有表的查询的权限付给本地lixiang这个用户,初始密码为123456

2、查看用户权限

show grants;#查看当前用户的权限
show grants for 'lixiang'@'localhost';#查看本地用户lixiang的权限
show grants for 'lixiang'@'192.168.10.4';#查看远程用户lixiang的权限
#注意:执行完成记得flush privileges;刷新一下

3、撤销用户权限

revoke select on mysql.* from 'lixiang'@'localhost';
#删除lixiang用户对mysql下的所有表的查询权限,注意:撤销完记得flush privileges;刷新一下

2.4.其他的常用的命令

1、用于显示广泛的服务器状态信息

show status;

2、显示服务器错误或警告信息

show errors;
show warnings;

3、显示当前连接用户

select user();

4、显示当前时间

select now();

5、显示当前数据库

select database();

6、显示服务器状态

status;

3.MySQL索引

3.1.数据库索引概述

1、数据库索引

  • 在数据库中,索引使数据库程序无需对整个表进行扫描,就可以在其中找到对应的数据。
  • 数据库的索引是某个表中一列或者若干列值的集合,以及物理标识这些值的数据页的逻辑指针清单。

2、索引的作用

  • 设置了合适的索引之后,数据库利用各种快速的定位技术,能够大大加快查询速率,特别是当表很大时,或者查询涉及到多个表时,使用索引可使查询加快成千倍。
  • 可以降低数据库的 IO成本,并且索引还可以降低数据库的排序成本。
  • 通过创建唯一性索引保证数据表数据的唯一性,可以加快表与表之间的连接。
  • 在使用分组和排序时,可大大减少分组和排序时间。

3、索引的分类

(1)普通索引

  • 这是最基本的索引类型,而且没有唯一性之类的限制。

(2)唯一性索引

  • 与普通索引基本相同,区别在于:索引列的所有值都只能出现一次,即必须唯一,但可为空。

(3)主键

  • 是一种特殊的唯一索引,必须指定为“PRIMARY KEY”,具有唯一性的同时不能为空。

(4)全文索引

  • MySQL从 3.23.23版开始支持全文索引和全文检索。在 MySQL中,全文索引的类型为FULLTEXT,全文索引可以在 VARCHAR或者 TEXT类型的列上创建。贴吧的文本内容,和一些小型的网站网页内容,存放在数据库中即为全文索引模式。

(5)单列索引与多列索引

  • 索引可以是单列上创建的索引,也可以是多列上创建的索引。

4、索引高性能保证

  • 把查询过程中的随机事件变成顺序事件
  • 数据保存在磁盘上,为了提高性能,每次又可以把部分的数据读到内存中来计算,访问磁盘的成本大概是访问内存的十万倍左右

磁盘IO与预读

  • 考虑到磁盘IO是非常高昂的操作,计算机操作系统做了一些优化,当一次IO时,不光把当前磁盘地址的数据读到内存缓冲区,而是把相邻的数据也读到内存缓冲区内,因为局部预读性原理,当计算机访问一个地址的数据的时候,
  • 与其它相邻的数据也会很快被访问到。每一次IO读取的数据我们称为一页(page)。具体一页有多大数据跟操作系统有关系,一般是4K或者8K。

3.2.常见的检索方案

  • 顺序检索:最基本的查询算法-复杂度O (n),大数据量此算法效率糟糕。
  • 二叉树查找(binary tree search):O(log2n),单层节点所能存储数据量较少,需要遍历多层才能定位到数据。
  • hash索引:无法满足范围查找,优点:等值检索快,hash值==物理地址,范围检索
  • B-TREE:每个节点都是一个二元数组[key,data],所有节点都可以存储数据。key为索引key,data为除key之外的数据。

3.3.B+Tree数据结构解析

  • B-Tree的缺点:插入删除新的数据记录会破坏B-Tree的性质,因此在插入删除时,需要对树进行一个分裂、合并、转移等操作以保持B-Tree性质。造成IO操作频繁。区间查找可能需要返回上层节点重复遍历,IO操作繁琐。
  • B+Tree的改进:非叶子节点不存储data,只存储索引key,只有叶子节点才存储data。

ec61028b48e14787ba7db8a141fafa04.jpg

高性能保证:

  • 三层的B+Tree可以表示上百万的数据,如果上百万的数据查找只需要三次IO,性能提高将是巨大的,如果没有索引,每个数据项都要发生一次IO,那么总共就是需要百万次的IO,显然成本非常高。
  • 在B+Tree的每个叶子节点增加一个指向相邻叶子节点的指针,就形成了带有顺序访问指针的B+Tree。
  • B+Tree只在叶子节点存储索引数据,所有叶子节点包含一个链指针,其他内层非叶子节点只存储索引数据。只利用索引快速定位数据索引范围,先定位索引在通过索引高效快速定位数据。

3.4.创建、查看、删除索引

根据企业需求选择了何时的索引之后,可以使用 CREATE INDEX创建索引,CREATE INDEX加上各个索引关键字便可创建各个类型的索引。

1、创建普通索引

格式:create index <索引的名字> on 表名(字段);
示例:create index my_index on student(id); 
查看表的索引:show index from student;

2、创建唯一性索引

格式:create unique index <索引名称> on 表名(字段);
示例:create unique index my_index on student(id);
查看表的索引:show keys from student;

3、创建主键索引

格式:alter table 表名 add primary key(字段);
示例:alter table student add primary key(员工ID);

4、删除索引

语法:drop index <索引的名称> on 表名;
   alter table 表名 drop index <索引的名称>;
   alter table 表名 drop primary key;
示例:
drop index my_index on student;
alter table student drop primary key;

5、不适合用索引的场景

  • 不适合键值较少的列(重复数据较多的列)
  • 索引无法存储null值

6、索引失效的场景

  • 如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少使用or的原因),想要使用or,又想让索引生效,只能将or条件中的每个列都加上索引
  • 对于多列索引,不是使用的第一部分,则不会使索引生效
  • like查询以%开头
  • 类型强转情况下不走索引,如varchar类型用long传参来查
  • hash索引不支持范围检索


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
19天前
|
SQL 存储 关系型数据库
不允许你不知道的 MySQL 优化实战(三)
不允许你不知道的 MySQL 优化实战(三)
26 1
|
23天前
|
关系型数据库 MySQL
【MySQL实战笔记】07 | 行锁功过:怎么减少行锁对性能的影响?-01
【4月更文挑战第18天】MySQL的InnoDB引擎支持行锁,而MyISAM只支持表锁。行锁在事务开始时添加,事务结束时释放,遵循两阶段锁协议。为减少锁冲突影响并发,应将可能导致最大冲突的锁操作放在事务最后。例如,在电影票交易中,应将更新影院账户余额的操作安排在事务末尾,以缩短锁住关键行的时间,提高系统并发性能。
15 4
|
24天前
|
关系型数据库 MySQL 数据库
【MySQL实战笔记】 06 | 全局锁和表锁 :给表加个字段怎么有这么多阻碍?-01
【4月更文挑战第17天】MySQL的锁分为全局锁、表级锁和行锁。全局锁用于全库备份,可能导致业务暂停或主从延迟。不加锁备份会导致逻辑不一致。推荐使用`FTWRL`而非`readonly=true`因后者可能影响其他逻辑且异常处理不同。表级锁如`lock tables`限制读写并限定操作对象,常用于并发控制。元数据锁(MDL)在访问表时自动加锁,确保读写正确性。
70 31
|
19天前
|
SQL 关系型数据库 MySQL
不允许你不知道的 MySQL 优化实战(二)
不允许你不知道的 MySQL 优化实战(二)
26 2
|
5天前
|
存储 缓存 算法
MySQL持久化不为人知的一面⭐️卡顿现象的根源与对策
MySQL持久化不为人知的一面⭐️卡顿现象的根源与对策
|
14天前
|
缓存 关系型数据库 MySQL
MySQL数据库性能优化实战
【4月更文挑战第30天】本文探讨了MySQL性能优化实战技巧,包括硬件与配置优化(如使用SSD、增加内存和调整配置参数)、索引优化(创建合适索引、使用复合索引及定期维护)、查询优化(避免全表扫描、减少JOIN和使用LIMIT)、分区与分片(表分区和数据库分片),以及使用缓存、定期清理数据库和监控诊断。通过这些方法,可以提升数据库性能和响应速度。
|
16天前
|
存储 关系型数据库 MySQL
MySQL数据库实战:从入门到精通
本文介绍了MySQL的使用和优化,适合Web开发者阅读。首先,确保安装并配置好MySQL,熟悉SQL基础。接着,通过命令行客户端连接数据库,执行创建、查询、添加、修改和删除数据等操作。学习数据类型并创建表存储数据。最后,探讨了数据库优化,包括查询优化和索引使用,以提升性能。
26 2
|
18天前
|
安全 关系型数据库 MySQL
node实战——后端koa结合jwt连接mysql实现权限登录(node后端就业储备知识)
node实战——后端koa结合jwt连接mysql实现权限登录(node后端就业储备知识)
23 3
|
19天前
|
SQL 关系型数据库 MySQL
不允许你不知道的 MySQL 优化实战(一)
不允许你不知道的 MySQL 优化实战(一)
26 2
|
22天前
|
关系型数据库 MySQL 中间件
【MySQL实战笔记】07 | 行锁功过:怎么减少行锁对性能的影响?-02 死锁和死锁检测
【4月更文挑战第19天】在高并发环境下,死锁发生在多个线程间循环等待资源时,导致无限期等待。MySQL中,死锁可通过`innodb_lock_wait_timeout`参数设置超时或`innodb_deadlock_detect`开启死锁检测来解决。默认的50s超时可能不适用于在线服务,而频繁检测会消耗大量CPU。应对热点行更新引发的性能问题,可以暂时关闭死锁检测(风险是产生大量超时),控制并发度,或通过分散记录减少锁冲突,例如将数据分拆到多行以降低死锁概率。
24 1