千家信息网

MySQL优化总结

发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,前言优化有风险,涉足需谨慎!!!1、优化可能带来的问题?优化不总是对一个单纯的环境进行,还很可能是一个复杂的已投产的系统。优化手段本来就有很大的风险,只不过我们可能没有能力意识到和预见到!任何的技术可
千家信息网最后更新 2025年01月20日MySQL优化总结

前言

优化有风险,涉足需谨慎!!!

1、优化可能带来的问题?

优化不总是对一个单纯的环境进行,还很可能是一个复杂的已投产的系统。

优化手段本来就有很大的风险,只不过我们可能没有能力意识到和预见到!

任何的技术可以解决一个问题,但必然存在带来一个问题的风险!

对于优化来说解决问题而带来的问题,控制在可接受的范围内才是有成果,保持现状或出现更差的情况都是失败。

2、优化的需求

  • 稳定性和业务的持续性,通常比性能更重要。
  • 优化不可避免涉及到变更,变更就有风险。
  • 优化使性能变好,维持和变差使等概率事件。
  • 切记优化,应该是各部门协同参与的工作,任何单一部门都不能对数据库进行优化。
  • 所有优化工作,是由业务需要驱使的。

3、优化由谁参与

在进行数据库优化时,应该由DBA、业务部门代表、应用程序设计人员、应用程序开发人员、运维等相关人员共同参与。

4、优化思路

在数据库优化上由两个主要方面:即安全与性能。

  • 安全:数据可持续性。
  • 性能:数据的高性能访问。

5、优化的范围有哪些?

存储、主机和操作系统方面:

  • 主机架构稳定性;
  • I/O规划及配置;
  • Swap交换分区;
  • OS内核参数和网络问题;
  • 应用程序方面;
  • 应用程序稳定性;
  • SQL语句性能;
  • 串行访问资源;
  • 性能欠佳会话管理;
  • 这个应用适不适合用MySQL;

数据库优化方面:

  • 内存;
  • 数据库结构(物理&逻辑);
  • 实例配置;

注:不管是在设计系统,定位问题还是优化,都可以按照上面顺序执行。

6、优化维度

数据库优化维度有以下四个:

  • 硬件;
  • 系统配置;
  • 数据库表结构;
  • SQL及索引;

优化选择:

  • 优化成本:硬件>系统配置>数据库表结构>SQL及索引
  • 优化效果:硬件<系统配置<数据库表结构< SQL及索引

7、优化工具

检查问题常用工具如下:

  • msyqladmin #mysql客户端,可进行管理操作;
  • mysqlshow #功能强大的查看shell命令;
  • show [SESSION|GLOBAL] variables #查看数据库参数信息
  • SHOW [SESSION|GLOBAL] STATUS #查看数据库的状态信息
  • information_schema # 获取元数据的方法
  • SHOW ENGINE INNODB STATUS #Innodb#引擎的所有状态
  • SHOW PROCESSLIST #查看当前所有连接session状态
  • explain #获取查询语句的执行计划
  • show index #查看表的索引信息
  • slow-log #记录慢查询语句
  • mysqldumpslow #分析slowlog文件的
  • mysqlslap #分析慢日志
  • mysql profiling #统计数据库整体状态工具
  • Performance Schema mysql #性能状态统计的数据
  • mysqlslap #分析慢日志
    第三方工具:
  • zabbix #监控主机、系统、数据库(部署zabbix监控平台)
  • pt-query-digest #分析慢日志
  • sysbench #压力测试工具
  • workbench #管理、备份、监控、分析、优化工具(比较费资源)

8、数据库层面问题解决思路

针对突然的业务办理卡顿,无法进行正常的业务处理!需要立马解决的场景!

1、show processlist
2、show index from table;
3、通过执行计划判断,索引问题(有没有、合不合理)或者语句本身问题
4、show status like '%lock%'; # 查询锁状态
5、kill SESSION_ID; # 杀掉有问题的session

常规调优思路

针对业务周期性的卡顿,例如在每天10-11点业务特别慢,但是还能够使用,过了这段时间就好了。

1、查看slowlog,分析slowlog,分析出查询慢的语句。
2、按照一定优先级,进行一个一个的排查所有慢语句。
3、分析top sql,进行explain调试,查看语句执行时间。
4、调整索引或语句本身。

系统层面

cpu方面:
vmstat、sar top、htop、nmon、mpstat

内存:
free、ps -aux 、

IO设备(磁盘、网络):
iostat、 ss 、 netstat 、 iptraf、iftop、lsof、

9、系统层面问题解决办法

在实际的生产中,一般认为 cpu只要不超过90%都没什么问题 。

当然不排除下面这些特殊情况:

问题一:cpu负载高,IO负载低

原因如下:

  • 内存不够,磁盘性能差
  • SQL问题:去数据库层,进一步排查sql问题
  • IO出问题了(磁盘到临界了、raid设计不好、raid降级、锁、在单位时间内tps过高)
  • tps过高: 大量的小数据IO、大量的全表扫描

问题二:IO负载高,cpu负载低

  • 大量小的IO 写操作:
  • autocommit ,产生大量小IO
  • IO/PS,磁盘的一个定值,硬件出厂的时候,厂家定义的一个每秒最大的IO次数。
  • 大量大的IO 写操作
  • SQL问题的几率比较大

问题三:IO和cpu负载都很高

硬件不够了或sql存在问题

10、 基础优化

定位问题点:
硬件 --> 系统 --> 应用 --> 数据库 --> 架构(高可用、读写分离、分库分表)

处理方向

明确优化目标、性能和安全的折中、防患未然。

硬件优化

主机方面:

  • 根据数据库类型,主机CPU选择、内存容量选择、磁盘选择
  • 平衡内存和磁盘资源
  • 随机的I/O和顺序的I/O
  • 主机 RAID卡的BBU(Battery Backup Unit)关闭

cpu的选择:

cpu的两个关键因素:核数、主频

根据不同的业务类型进行选择:

  • cpu密集型:计算比较多,OLTP 主频很高的cpu、核数还要多
  • IO密集型:查询比较,OLAP 核数要多,主频不一定高的

内存的选择:

  • OLAP类型数据库,需要更多内存,和数据获取量级有关。
  • OLTP类型数据一般内存是cpu核心数量的2倍到4倍,没有最佳实践。

存储方面:

  • 根据存储数据种类的不同,选择不同的存储设备
  • 配置合理的RAID级别(raid5、raid10、热备盘)

对与操作系统来讲,不需要太特殊的选择,最好做好冗余(raid1)(ssd、sas 、sata)

raid卡:主机raid卡选择:

  • 实现操作系统磁盘的冗余(raid1)
  • 平衡内存和磁盘资源
  • 随机的I/O和顺序的I/O
  • 主机 RAID卡的BBU(Battery Backup Unit)要关闭。

网络设备方面:

  • 使用流量支持更高的网络设备(交换机、路由器、网线、网卡、HBA卡)

注意:以上这些规划应该在初始设计系统时就应该考虑好。

服务器硬件优化

1、物理状态灯:
2、自带管理设备:远程控制卡(FENCE设备:ipmi ilo idarc),开关机、硬件监控。
3、第三方的监控软件、设备(snmp、agent)对物理设施进行监控
4、存储设备:自带的监控平台。EMC2(hp收购了), 日立(hds),IBM低端OEM hds,高端存储是自己技术,华为存储

系统优化

Cpu:

基本不需要调整,在硬件选择方面下功夫即可。

内存:

基本不需要调整,在硬件选择方面下功夫即可。

SWAP:

MySQL尽量避免使用swap。阿里云的服务器中默认swap为0

IO :

raid、no lvm、 ext4或xfs、ssd、IO调度策略

不使用swap分区

/proc/sys/vm/swappiness的内容改成0(临时)

/etc/sysctl.conf上添加vm.swappiness=0(永久)

这个参数决定了Linux是倾向于使用swap,还是倾向于释放文件系统cache。在内存紧张的情况下,数值越低越倾向于释放文件系统cache。当然,这个参数只能减少使用swap的概率,并不能避免Linux使用swap。

修改MySQL的配置参数innodb_flush_method,开启O_DIRECT模式。这种情况下,InnoDB的buffer pool会直接绕过文件系统cache来访问磁盘,但是redo log依旧会使用文件系统cache。值得注意的是,Redo log是覆写模式的,即使使用了文件系统的cache,也不会占用太多。

IO调度策略

#echo deadline > /sys/block/sda/queue/scheduler #临时修改为deadline

永久修改如下:

$ vi /boot/grub/grub.conf#更改到如下内容:kernel /boot/vmlinuz-2.6.18-8.el5 ro root=LABEL=/ elevator=deadline rhgb quiet

11、系统参数调整

Linux系统内核参数优化:

$vim /etc/sysctl.confnet.ipv4.ip_local_port_range =102465535# 用户端口范围 net.ipv4.tcp_max_syn_backlog =4096net.ipv4.tcp_fin_timeout =30fs.file-max=65535# 系统最大文件句柄,控制的是能打开文件最大数量

用户限制参数(mysql可以不设置以下配置)

$vim/etc/security/limits.conf* soft nproc65535* hard nproc65535* soft nofile65535* hard nofile65535

12、应用优化

业务应用和数据库应用独立,防火墙:iptables、selinux等其他无用服务(关闭):

$ chkconfig --level 23456 acpid off$ chkconfig --level 23456 anacronoff$ chkconfig --level 23456 autofsoff$ chkconfig --level 23456 avahi-daemonoff$ chkconfig --level 23456 bluetoothoff$ chkconfig --level 23456 cupsoff$ chkconfig --level 23456 firstbootoff$ chkconfig --level 23456 haldaemonoff$ chkconfig --level 23456 hplipoff$ chkconfig --level 23456 ip6tablesoff$ chkconfig --level 23456 iptablesoff$ chkconfig --level 23456 isdnoff$ chkconfig --level 23456 pcscdoff$ chkconfig --level 23456 sendmailoff$ chkconfig --level 23456 yum-updatesdoff

安装图形界面的服务器不要启动图形界面 runlevel 3,另外,将来我们的业务是否真的需要MySQL,还是使用其他种类的数据库。用数据库的最高境界就是不用数据库。

13、数据库优化

SQL优化方向:

执行计划、索引、SQL改写

架构优化方向:

高可用架构、高性能架构、分库分表

14、数据库参数优化

调整:

  • 实例整体(高级优化,扩展)
  • thread_concurrency #并发线程数量个数
  • sort_buffer_size #排序缓存
  • read_buffer_size #顺序读取缓存
  • read_rnd_buffer_size #随机读取缓存
  • key_buffer_size #索引缓存
  • thread_cache_size #线程缓存(1G->8, 2G->16, 3G>32,3G->64)

连接层(基础优化)

设置合理的连接客户和连接方式:

  • max_connections #最大连接数,看交易笔数设置
  • max_connect_errors #最大错误连接数,能大则大
  • connect_timeout #连接超时
  • max_user_connections #最大用户连接数
  • skip-name-resolve #跳过域名解析
  • wait_timeout #等待超时
  • back_log #可以在堆栈中的连接数量

SQL层(基础优化)

query_cache_size: 查询缓存
OLAP类型数据库,需要重点加大此内存缓存.
但是一般不会超过GB.
对于经常被修改的数据,缓存会立马失效。
我们可以实用内存数据库(redis、memecache),替代他的功能。

15、存储引擎层(innodb基础优化参数)

  • default-storage-engine
  • innodb_buffer_pool_size # 没有固定大小,50%测试值,看看情况再微调。但是尽量设置不要超过物理内存70%
  • innodb_file_per_table=(1,0)
  • innodb_flush_log_at_trx_commit=(0,1,2) #1是最安全的,0是性能最高,2折中
  • binlog_sync
  • Innodb_flush_method=(O_DIRECT, fdatasync)
  • innodb_log_buffer_size #100M以下
  • innodb_log_file_size #100M 以下
  • innodb_log_files_in_group #5个成员以下,一般2-3个够用(iblogfile0-N)
  • innodb_max_dirty_pages_pct #达到百分之75的时候刷写 内存脏页到磁盘。
  • max_binlog_cache_size #可以不设置
  • max_binlog_size #可以不设置
  • innodb_additional_mem_pool_size #小于2G内存的机器,推荐值是20M。32G内存以上100M

注:在生产环境中,数据库的各个参数都是随着需求去更改的,但是没有必要去为了更改一个配置参数去重启数据库,但是我们可以先将需要更改的配置项设置为全局环境变量,以便生效,然后再写入配置文件中,只要数据库不重启,设置的环境变量就不会失效,一旦重启,配置文件就会生效。

配置文件可以参考如下格式:

$ cat /etc/my.cnf[mysqld]basedir=/usr/local/mysqldatadir=/usr/local/mysql/dataport=3306server_id=1 slow_query_log = 1slow_query_log_file = /usr/local/mysql/data/slow-query.loglong_query_time = 1log-queries-not-using-indexesmax_connections = 1024back_log = 128wait_timeout = 60interactive_timeout = 7200key_buffer_size=256Mquery_cache_size = 256Mquery_cache_type=1query_cache_limit=50Mmax_connect_errors=20sort_buffer_size = 2Mmax_allowed_packet=32Mjoin_buffer_size=2Mthread_cache_size=200innodb_buffer_pool_size = 2048Minnodb_flush_log_at_trx_commit = 1innodb_log_buffer_size=32Minnodb_log_file_size=128Minnodb_log_files_in_group=3log-bin=mysql-binbinlog_cache_size=2Mmax_binlog_cache_size=8Mmax_binlog_size=512Mexpire_logs_days=7read_buffer_size=1Mread_rnd_buffer_size=16Mbulk_insert_buffer_size=64Mlog-error = /usr/local/mysql/data/mysqld.err

-------- 本文至此结束,感谢阅读 --------

数据 数据库 问题 系统 内存 配置 参数 选择 文件 硬件 业务 性能 方面 磁盘 应用 主机 索引 缓存 设备 语句 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广东口碑好的网络技术诚信服务 明日之后人数最多的服务器是什么 华为 服务器 售价 臻享网络技术有限公司 平台化建设去中心软件开发 鄞州一站式软件开发外包 数据库中的隐藏状态 网络安全知识 小学生视频 软件开发需保密的内容 数据库与大数据应用实验报告 国家授时中心的服务器 超微服务器稳定性怎么样 文件服务器资源管理器配额 亚信云互联网信息科技公司 什么是数据库安全评估 江门采购管理软件开发 实现数据库 局域网网络安全用语 广东服务器机柜厂家有哪些 移动互联网软件开发专业 云南游戏服务器地址云主机 滑坡检测系统集成软件开发 软件开发单价每人天 数据库开发视频 数据库技术的具体应用 上海特定网络技术转让价目表 网络安全整体解决方案价格 网络广告机如何自己装服务器 长春网络安全特训营 安徽工控软件开发报价
0