AI 助理
备案 控制台
开发者社区 数据库 文章 正文

史上最全SQL优化方案

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
推荐场景:
学生管理系统数据库设计 搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: 在进行MySQL的优化之前,必须要了解的就是MySQL的查询过程,很多查询优化工作实际上就是遵循一些原则,让MySQL的优化器能够按照预想的合理方式运行而已。

作者:惨绿少年

https://www.cnblogs.com/clsn/p/8214048.html

在进行MySQL的优化之前,必须要了解的就是MySQL的查询过程,很多查询优化工作实际上就是遵循一些原则,让MySQL的优化器能够按照预想的合理方式运行而已。
image.png
图-MySQL查询过程

1.优化的哲学

注:优化有风险,涉足需谨慎

a优化可能带来的问题?

  • 优化不总是对一个单纯的环境进行,还很可能是一个复杂的已投产的系统;
  • 优化手段本来就有很大的风险,只不过你没能力意识到和预见到;
  • 任何的技术可以解决一个问题,但必然存在带来一个问题的风险;
  • 对于优化来说解决问题而带来的问题,控制在可接受的范围内才是有成果;
  • 保持现状或出现更差的情况都是失败!

b优化的需求?

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

所以优化工作,是由业务需要驱使的!

c优化由谁参与?
在进行数据库优化时,应由数据库管理员、业务部门代表、应用程序架构师、应用程序设计人员、应用程序开发人员、硬件及系统管理员、存储管理员等,业务相关人员共同参与。

2.优化思路

a优化什么?
在数据库优化上有两个主要方面:即安全与性能。

  • 安全->数据可持续性;
  • 性能->数据的高性能访问。

b优化的范围有哪些?
存储、主机和操作系统方面:

  • 主机架构稳定性;
  • I/O规划及配置;
  • Swap交换分区;
  • OS内核参数和网络问题。

应用程序方面:

  • 应用程序稳定性;
  • SQL语句性能;
  • 串行访问资源;
  • 性能欠佳会话管理;
  • 这个应用适不适合用MySQL。

数据库优化方面:

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

说明:不管是设计系统、定位问题还是优化,都可以按照这个顺序执行。

c优化维度?
数据库优化维度有四个:
硬件、系统配置、数据库表结构、SQL及索引。
image.png

优化选择:

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

3.优化工具有啥?

a数据库层面?
检查问题常用工具:

1)MySQL  
2)msyqladmin:MySQL客户端,可进行管理操作   
3)mysqlshow:功能强大的查看shell命令  
4)show [SESSION | GLOBAL] variables:查看数据库参数信息  
5)SHOW [SESSION | GLOBAL] STATUS:查看数据库的状态信息  
6)information_schema:获取元数据的方法  
7)SHOW ENGINE INNODB STATUS:Innodb引擎的所有状态  
8)SHOW PROCESSLIST:查看当前所有连接session状态  
9)explain:获取查询语句的执行计划  
10)show index:查看表的索引信息  
11)slow-log:记录慢查询语句  
12)mysqldumpslow:分析slowlog文件的  

不常用但好用的工具:

1)Zabbix:监控主机、系统、数据库(部署zabbix监控平台)  
2)pt-query-digest:分析慢日志  
3)MySQL slap:分析慢日志  
4)sysbench:压力测试工具  
5)MySQL profiling:统计数据库整体状态工具    
6)Performance Schema:MySQL性能状态统计的数据  
7)workbench:管理、备份、监控、分析、优化工具(比较费资源)  

关于Zabbix参考:
http://www.cnblogs.com/clsn/p/7885990.html

b数据库层面问题解决思路?
一般应急调优的思路:针对突然的业务办理卡顿,无法进行正常的业务处理,需要立马解决的场景。

1)show processlist;  
2)explain  select id ,name from stu where name='clsn'; # ALL  id name age  sex;  
select id,name from stu  where id=2-1 函数 结果集>30;show index from table;  
3)通过执行计划判断,索引问题(有没有、合不合理)或者语句本身问题;  
4)show status  like '%lock%';    # 查询锁状态  
kill SESSION_ID;   # 杀掉有问题的session。  

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

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

c系统层面?
Cpu方面:

vmstat、sar top、htop、nmon、mpstat;

内存:

free、ps-aux;

IO设备(磁盘、网络):

iostat、ss、netstat、iptraf、iftop、lsof;

vmstat命令说明:

1)Procs:r显示有多少进程正在等待CPU时间。b显示处于不可中断的休眠的进程数量。在等待I/O。  
2)Memory:swpd显示被交换到磁盘的数据块的数量。未被使用的数据块,用户缓冲数据块,用于操作系统的数据块的数量。  
3)Swap:操作系统每秒从磁盘上交换到内存和从内存交换到磁盘的数据块的数量。s1和s0最好是0。
4)Io:每秒从设备中读入b1的写入到设备b0的数据块的数量。反映了磁盘I/O。  
5)System:显示了每秒发生中断的数量(in)和上下文交换(cs)的数量。  
6)Cpu:显示用于运行用户代码,系统代码,空闲,等待I/O的Cpu时间。  

iostat命令说明:

实例命令:iostat -dk 1 5  
      iostat -d -k -x 5 (查看设备使用率(%util)和响应时间(await))  
1)tps:该设备每秒的传输次数。“一次传输”意思是“一次I/O请求”。多个逻辑请求可能会被合并为“一次I/O请求”。  
2)iops :硬件出厂的时候,厂家定义的一个每秒最大的IO次数  
3)"一次传输"请求的大小是未知的。  
4)kB_read/s:每秒从设备(drive expressed)读取的数据量;  
5)KB_wrtn/s:每秒向设备(drive expressed)写入的数据量;  
6)kB_read:读取的总数据量;  
7)kB_wrtn:写入的总数量数据量;这些单位都为Kilobytes。  

d系统层面问题解决办法?
你认为到底负载高好,还是低好呢?在实际的生产中,一般认为Cpu只要不超过90%都没什么问题。

当然不排除下面这些特殊情况:
Cpu负载高,IO负载低:

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

IO负载高,Cpu负载低:

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

IO和cpu负载都很高:

硬件不够了或SQL存在问题。  

4基础优化

a优化思路?
定位问题点吮吸:硬件-->系统-->应用-->数据库-->架构(高可用、读写分离、分库分表)。
处理方向:明确优化目标、性能和安全的折中、防患未然。

b硬件优化?
主机方面:

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

CPU的选择:

CPU的两个关键因素:核数、主频  
根据不同的业务类型进行选择:  
1)CPU密集型:计算比较多,OLTP - 主频很高的cpu、核数还要多  
2)IO密集型:查询比较,OLAP - 核数要多,主频不一定高的  

内存的选择:

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

存储方面:

1)根据存储数据种类的不同,选择不同的存储设备;  
2)配置合理的RAID级别(raid5、raid10、热备盘);  
3)对与操作系统来讲,不需要太特殊的选择,最好做好冗余(raid1)(ssd、sas、sata)。  
4)raid卡:    
       主机raid卡选择:  
       实现操作系统磁盘的冗余(raid1);  
       平衡内存和磁盘资源;  
       随机的I/O和顺序的I/O;  
       主机raid卡的BBU(Battery Backup Unit)要关闭。  

网络设备方面:

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

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

c服务器硬件优化?

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

d系统优化?
Cpu:

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

内存:

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

SWAP:

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

IO :

raid、no lvm、ext4或xfs、ssd、IO调度策略。 
Swap调整(不使用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

e系统参数调整?

Linux系统内核参数优化:  
vim/etc/sysctl.conf  
net.ipv4.ip_local_port_range = 1024 65535:# 用户端口范围  
net.ipv4.tcp_max_syn_backlog = 4096   
net.ipv4.tcp_fin_timeout = 30   
fs.file-max=65535:# 系统最大文件句柄,控制的是能打开文件最大数量  

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

vim/etc/security/limits.conf  
* soft nproc 65535  
* hard nproc 65535  
* soft nofile 65535  
* hard nofile 65535  

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

chkconfig --level 23456 acpid off  
chkconfig --level 23456 anacron off  
chkconfig --level 23456 autofs off  
chkconfig --level 23456 avahi-daemon off  
chkconfig --level 23456 bluetooth off  
chkconfig --level 23456 cups off  
chkconfig --level 23456 firstboot off  
chkconfig --level 23456 haldaemon off  
chkconfig --level 23456 hplip off  
chkconfig --level 23456 ip6tables off  
chkconfig --level 23456 iptables  off  
chkconfig --level 23456 isdn off  
chkconfig --level 23456 pcscd off  
chkconfig --level 23456 sendmail  off  
chkconfig --level 23456 yum-updatesd  off

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

5.数据库优化

SQL优化方向:执行计划、索引、SQL改写。
架构优化方向:高可用架构、高性能架构、分库分表。

a数据库参数优化?
调整

实例整体(高级优化,扩展):  
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),替代他的功能。  

b存储引擎层(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的时候刷写 内存脏页到磁盘。  
log_bin  
max_binlog_cache_size                     # 可以不设置  
max_binlog_size                               # 可以不设置  
innodb_additional_mem_pool_size     #小于2G内存的机器,推荐值是20M。32G内存以上100M
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
茶什i
目录
相关文章
1100237741946300
|
1月前
|
SQL 数据库 开发者
MSSQL性能调优实战技巧:索引优化、SQL语句微调与并发控制策略
在Microsoft SQL Server(MSSQL)的管理与优化中,性能调优是一项复杂但至关重要的任务
1100237741946300
38 3
1100237741946300
|
1月前
|
SQL 监控 数据库
MSSQL性能调优实战策略:索引优化、SQL语句重构与并发控制
在Microsoft SQL Server(MSSQL)的管理和优化过程中,性能调优是确保数据库高效运行、满足业务需求的重要环节
1100237741946300
41 3
1100237741946300
|
1月前
|
SQL 监控 数据库
MSSQL性能调优实战技巧:索引优化策略、SQL查询重构与并发控制详解
在Microsoft SQL Server(MSSQL)的管理与优化过程中,性能调优是确保数据库高效运行的关键环节
1100237741946300
49 2
1100237741946300
|
1月前
|
SQL 监控 数据库
MSSQL性能调优实战指南:精准索引策略、SQL查询优化与高效并发控制
在Microsoft SQL Server(MSSQL)的性能调优过程中,精准索引策略、SQL查询优化以及高效并发控制是三大核心要素
1100237741946300
44 0
sunrr
|
25天前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
sunrr
44 13
sunrr
|
16天前
|
SQL 安全 数据库
如何优化SQL查询
【8月更文挑战第1天】如何优化SQL查询
sunrr
22 2
sunrr
|
16天前
|
SQL 缓存 关系型数据库
SQL如何优化查询?
【8月更文挑战第1天】SQL如何优化查询?
sunrr
27 1
萝卜丝丸子
|
24天前
|
SQL
SQL开发问题之当从数据源读取多个字段时优化 COUNT(DISTINCT ...) 的查询的问题如何解决
SQL开发问题之当从数据源读取多个字段时优化 COUNT(DISTINCT ...) 的查询的问题如何解决
萝卜丝丸子
49 7
hju6meadphitw
|
20天前
|
SQL 数据采集 数据管理
SQL数据:探索、管理与优化的全面解析
在信息化时代,数据成为企业核心资产。本文探讨SQL在数据探索、管理与优化中的作用:使用DESC、SELECT了解数据集;评估数据质量;发现数据特征。管理方面,涵盖数据存储、检索、更新与维护。优化则涉及索引、查询及数据库设计,确保高性能和效率。掌握SQL能有效挖掘数据价值,支持企业决策与创新。
hju6meadphitw
26 1
嘟嘟嘟嘟嘟嘟
|
22天前
|
SQL 关系型数据库 分布式数据库
PolarDB产品使用问题之SQL查询该如何优化
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
嘟嘟嘟嘟嘟嘟
25 1

热门文章

最新文章

  • 1
    在SQL Server中创建用户角色及授权(使用SQL语句)
  • 2
    SQL老司机,在SQL中计算 array & map & json数据
  • 3
    RDS for SQL server 空间问题排查汇总
  • 4
    oracle Sql语句Date转long时间戳
  • 5
    PostgreSQL在何处处理 sql查询之三十一
  • 6
    Windows2003 配置 tomcat+jdk(java)+JDBC+SQL2000
  • 7
    SQL SHOW系列(三)
  • 8
    关于SQL中的Update语句
  • 9
    允许SQL Server 2005远程连接
  • 10
    AlwaysOn可用性组功能测试(2)-SQL Server群集故障转移
  • 1
    利用 SQL 注入提取数据方法总结
    39
  • 2
    SQL 注入神器:jSQL Injection 保姆级教程
    181
  • 3
    DataWorks产品使用合集之在DataWorks的数据开发模式中,在presql和postsql中支持执行多条SQL语句如何解决
    114
  • 4
    【MySQL】:探秘主流关系型数据库管理系统及SQL语言
    143
  • 5
    MaxCompute产品使用合集之大数据计算MaxCompute即使用相同的SQL语句在DataWorks和Tunnel上执行,结果却不同,如何解决
    37
  • 6
    MaxCompute产品使用合集之阿里云MaxCompute对SQL语句的长度的长度限制是多少
    73
  • 7
    MS SQL Server partition by 函数实战 统计与输出
    33
  • 8
    MaxCompute操作报错合集之在sql 里嵌套查询时,查询条件带有instr时报错,如何解决
    55
  • 9
    MS SQL Server STUFF 函数实战 统计记录行转为列显示
    81
  • 10
    SQL SERVER ANALYSIS SERVICES决策树、聚类、关联规则挖掘分析电商购物网站的用户行为数据
    85
  • 相关课程

    更多
  • 如何在 PolarDB-X 中优化慢 SQL
  • SQL完全自学手册
  • SQL Server on Linux入门教程
  • SQL入门与实践
  • 数据库及SQL/MySQL基础
  • SQL进阶及查询
  • 相关电子书

    更多
  • SQL Server在电子商务中的应用与实践
  • GeoMesa on Spark SQL
  • 原生SQL on Hadoop引擎- Apache HAWQ 2.x最新技术解密malili
  • 相关实验场景

    更多
  • 数据库实验室挑战任务-中级任务
  • 数据库实验室挑战任务-初级任务
  • SQL的增删改查及函数应用
  • 快速上手并跑通AnalyticDB PostgreSQL版TPC-H测试
  • PolarDB MySQL自动SQL限流
  • 使用DAS实现数据库自动SQL限流
  • 下一篇
    阿里云对象存储OSS收费价格表

    PHP网站源码坑梓网站优化按天收费丹竹头高端网站设计布吉seo优化西乡百姓网标王推广观澜阿里店铺托管沙井如何制作网站南联网站优化按天扣费双龙百度网站优化排名福田如何制作网站永湖企业网站建设大浪企业网站改版爱联网站制作设计坪山英文网站建设大鹏建站南山企业网站建设深圳SEO按天扣费平湖营销型网站建设盐田网站搜索优化荷坳百度竞价吉祥企业网站设计东莞网络营销沙井阿里店铺运营大鹏设计网站大运设计网站民治至尊标王同乐百姓网标王推广平湖模板推广横岗网站推广永湖百度竞价包年推广民治网站优化按天计费歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

    PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化