首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >mysql全面优化

mysql全面优化

原创
作者头像
萧晚歌
修改于 2022-03-29 10:07:44
修改于 2022-03-29 10:07:44
57800
代码可运行
举报
文章被收录于专栏:linux技术分享linux技术分享
运行总次数:0
代码可运行

mysql优化思路

1硬件层优化

2系统优化

3mysql软件及版本选主

4mysql三层结构及参数优化

5mysql开发规范

6mysql索引优化

7mysql的事务及锁优化

8mysql架构优化

9mysql的安全优化

1硬件优化

1纯硬件服务器

华为 浪潮

cpu

i系列是计算密集型

e系列io类型

io sas

raid卡 建议 raid 10

网卡 单卡单口

2云服务器 ecs rds

3关闭 numa

会把你的内存绑定到cpu上

numa是控制cpu分配内存的控制手段,比如8核cpu 64G内存,每个核心分为8个核心的内存大家就不会争抢资源了,那为什么要关闭numa呢?

对于mysql来讲呢用不上这个机制,myslq有独立的内存管理机制,他怎么分内存,线程如何使用内存是mysql自己独立控制的不希望别人来控制这个内存的使用,完全公平去分配的话,有的时候某一个线程需要的内存大一些会出现阻塞 ,最后关闭numa。

4关闭thp

在centos6之后才加入的一个分配内存的机制,为什么要关闭系统新加入的内存机制THP。

因为应用在申请内存的时候呢,因为mysql不需要他来管理内存机制,mysql有自己的内存管理机制

THP分配的内存可能会比mysql实际需要的多的多,因为mysql内部机制申请内存是16kb,THP分配大页内存机制是1M这个时候就会出现内存碎片,内存碎片就是THP分配给mysql多余的内存,不会进行释放(还是一直在占用资源),这个时候会产生OOM,内存溢出,会造成资源的浪费,操作系统没有内存可以使用了,就会kill掉mysql这个线程, 生产建议关闭(推荐)。

2系统优化

内核优化 /etc/sysctl.conf

更改文件句柄和进程数

vm.swappiness = 5(也可以设置为0) #物理内存剩余百分之5启动交换分区swap,推荐是不要设置0防止OOM

vm.dirty_ratio = 20 ## 脏页比例达到百分之多少进行刷新,脏页文件系统缓存中一些被修改完的数据需要落入到磁盘中的数据

vm.dirty_background_ratio = 10 ##脏页异步刷新,上面是同步刷新

##vm dirty参数要根据自己硬盘的性能调整参数,磁盘性能高就调低,磁盘性能差就调高,上面是ssd磁盘的配置,性能差就让他刷新的频率不要那么频繁

net.ipv4.tcp_max_syn_backlog = 819200

net.core.netdev_max_backlog = 400000

net.core.somaxconn = 4096

net.ipv4.tcp_tw_reuse=1

net.ipv4.tcp_tw_recycle=0

文件句柄

文件句柄就是你打开某个文件,在磁盘的对应关系,你打开某个文件就是找到这个文件句柄的位置如果文件句柄满了会怎么样?

为什么要打开文件句柄的限制,因为数据库需要打开的文件数很大,如果文件句柄同打开数量过小,数据库会报错连接失败

文件句柄设置示例:

vi /etc/security/limits.conf

* soft nofile 204800

* hard nofile 204800

* soft nproc 204800

* hard nproc 204800

查看是否生效

ulimit -a

内存显示95%

vm.dirty_ratio = 20 调整刷脏页

数据库 ckpt

innodb flush method =o_direct

mysql建议分区独立

不使用lvm

io调度

sas :deadline

ssd noop

cat/sys/block/sda/queue/scheduler

top补充

关注第一项是cpu

按一下1就可以看到各个cpu状态

关注点

1us

2sy 内核

3id 空闲的

us很高是正常现象

任何程序需要往磁盘写什么东西

程序要跟内核交互 内核刷磁盘

并发太多了会导致us高sy高

归根揭底找它干活的太多了

wa状态

把内存数据刷磁盘的时候等待的状态

等待也会耗费cpu

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql占用cpu非常高
ps -ef |grep mysqld 看一下mysql的进程号
top -Hp  进程号  看mysql的那个线程使用cpu过高
去mysql 
select  * from performance_schema.threads;
去找os的线程
看是什么线程
内存太小了

mysql锁相关

latch 栓锁

并发应用的时候保护内存的数据结构对象针对线程

show engine innodb mutex

需要看源码

mdl锁类型

ftwrl: flush tables with read lock

解锁方法 unlock tables

排查方法

select * from performance_schema.metadata_locks\G

看是什么类型的锁,是对什么对象 看是不是持有的

5.6是需要打开的

5.7可以看

show processlist;

select * from sys.schema_table_lock_waits;

可以配合找到

select * from performance_schema.threads;

找到后台线程

监控

show status like 'innodb_row——lock%'

优化方向

1索引优化

2减少事务的更新范围

3rc级别

4拆分语句

死锁

show engine innodb status \G

innodb_print_all_deadlocks =1 记录日志

rc级别有外键的话可能会有间隙

rr级别

间隙锁,索引扫描是区间

如果大于5

会扫描第一个 先找到5 往下遍历 记录加锁

5前面的间隙不会加锁,直到最后一个不满足条件为止

加锁规则

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1加锁的基本单位是 next-key lock 并且 next-key lock 是左开右闭的区间,直到最后一个不满足条件为止
2 查找过程中访问到的索引才会加锁
3 索引上的等值查询,给唯一索引加锁的时候next-key lock 会退化行锁
id列
4 索引的等值查询,向右遍历向又扫描最后一个值不满足等值条件的时候 next-key lock 退化为间隙
a=5
555510]12
10之后可以插入
插入6就不行
8019之前的bug 唯一索引上的查询范围会访问到不满足条件的第一个值为止

如果找a=5

会找到5,10的范围

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
mysql innodb核心
在page页的头,是递增的一个序列号,针对log buffer 生成,每条日志都会有字节量的占用
萧晚歌
2022/02/22
1.4K0
MySQL锁详解
全局锁就是对整个数据库实例加锁。MySQL提供了一个加全局读锁的方法,命令是Flush tables with read lock。当需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句
全栈程序员站长
2022/08/12
7651
MySQL锁详解
MySQL锁、加锁机制(超详细)—— 锁分类、全局锁、共享锁、排他锁;表锁、元数据锁、意向锁;行锁、间隙锁、临键锁;乐观锁、悲观锁
客户端发往MySQL的一条条SQL语句,实际上都可以理解成一个个单独的事务(一条sql语句默认就是一个事务)。而事务是基于数据库连接的,每个数据库连接在MySQL中,又会用一条工作线程来维护,也意味着一个事务的执行,本质上就是一条工作线程在执行,当出现多个事务同时执行时,这种情况则被称之为并发事务,所谓的并发事务也就是指多条线程并发执行。
寻求出路的程序媛
2024/06/24
25.1K5
MySQL锁、加锁机制(超详细)—— 锁分类、全局锁、共享锁、排他锁;表锁、元数据锁、意向锁;行锁、间隙锁、临键锁;乐观锁、悲观锁
⑩⑦【MySQL】锁:全局锁、表级锁、行级锁
①表锁 :表共享读锁(read lock) / 表独享写锁(write lock)
.29.
2023/11/21
9080
⑩⑦【MySQL】锁:全局锁、表级锁、行级锁
Mysql学习笔记【锁】
在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放。
Porco1Rosso
2020/06/30
6710
Mysql学习笔记【锁】
第15章_锁
🧑个人简介:大家好,我是 shark-Gao,一个想要与大家共同进步的男人😉😉
程序员Leo
2023/08/02
2670
第15章_锁
Mysql的各种锁——Mysql系列(三)
https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html#innodb-shared-exclusive-locks
翰墨飘香
2023/06/11
6760
万字硬核实战分析MySQL死锁
本文先完整介绍MySQL的各种锁类型及加锁机制,之后通过一个案例带大家了解如何分析排查死锁问题。最后,再介绍几种预防死锁的方法。以下是示例表的表结构
会玩code
2022/04/24
1K0
万字硬核实战分析MySQL死锁
MySQL 锁
锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。
用户9615083
2022/12/25
1.4K0
MySQL 锁
MySQL的行级锁锁的到底是什么?
往期在文章《介绍Innodb的锁机制》中提到过关于记录锁,但是没有详细展开描述。本片文章简单聊一聊。
@派大星
2024/05/13
3440
MySQL高级9-锁
  锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除了传统的计算资源(CPU、RAM、i/O)的挣用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性,有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素,从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。
Se7eN_HOU
2023/09/06
2900
MySQL高级9-锁
【MySQL】一文带你搞懂MySQL中的各种锁
锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资( CPU 、
陶然同学
2023/10/14
2.3K0
【MySQL】一文带你搞懂MySQL中的各种锁
【MySQL】一文带你理清<行级锁>(行锁,间隙锁,临键锁)
默认情况下,InnODB在 REPEATABLE READ事务隔离级别运行,InnoDB使用 临键锁 进行搜索和索引扫描,以防止幻读。(本次演示)
YY的秘密代码小屋
2024/09/09
9020
【MySQL】一文带你理清<行级锁>(行锁,间隙锁,临键锁)
MySQL实战45讲 笔记
不要小看一条 update 语句,在生产机上使用不当可能会导致业务停滞,甚至崩溃。
OwenZhang
2021/12/08
7580
MySQL实战45讲 笔记
Mysql行级锁
锁是计算机协调多个进程或纯线程并发访问某一资源的机制. 在mysql中更是用处多多, 今天就一起看下mysql中的行级锁. 它主要包括行锁, 间隙锁, 临键锁三种. 首先我们先了解几个基础概念.
一个架构师
2022/06/27
3.6K0
Mysql行级锁
【MySQL-25】万字总结<锁>——(全局锁&行级锁&表级锁)【共享锁,排他锁】【间隙锁,临键锁】【表锁,元数据锁,意向锁】
默认情况下,InnODB在 REPEATABLE READ事务隔离级别运行,InnoDB使用 临键锁 进行搜索和索引扫描,以防止幻读。(本次演示)
YY的秘密代码小屋
2024/09/09
3350
【MySQL-25】万字总结<锁>——(全局锁&行级锁&表级锁)【共享锁,排他锁】【间隙锁,临键锁】【表锁,元数据锁,意向锁】
MySQL并不孤单的存在—硬件环境的限制与优化
之所以写这篇文章也是因为前几天出的一个问题,当时业务感觉到卡顿,并且伴随着锁超时的报错。最后通过分析发现是由于磁盘I/Q繁忙导致SQL耗时增加,部分锁竞争激烈的热数据出现了锁等待和锁超时。由此可见,系统的硬件环境对数据库整体性能的影响也是非常大的,MySQL在运行环境中并不是孤立存在的,它的整体性能往往受限于系统最薄弱的环节,今天想和大家分享下,都有哪些系统指标会对数据库的整体性能产生影响,我们又如何进行分析。
MySQL数据库技术栈
2020/08/04
1.4K0
Mysql-Innodb 锁总结
    Flush tables 做的是将缓存刷回硬盘,with read lock 给所有表加读锁,对于大部分 lock,当客户端连接断开的时候,锁一般会释放。
执生
2020/11/24
6260
Mysql-Innodb 锁总结
MySQL知识体系(DS整理)
存储引擎(Storage Engine)是数据库管理系统中负责数据存储、检索和管理的核心组件,它决定了:
Him
2025/05/04
3650
SQL锁总结
锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。
海盗船长
2023/10/11
2910
SQL锁总结
相关推荐
mysql innodb核心
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验