史上最全的 SQL 优化方案!建议收藏

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

图-MySQL查询过程

1

优化的哲学

 

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

a

优化可能带来的问题?

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

  • 优化手段本来就有很大的风险,只不过你没能力意识到和预见到;

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

  • 对于优化来说解决问题而带来的问题,控制在可接受的范围内才是有成果;

  • 保持现状或出现更差的情况都是失败!


b

优化的需求?

  • 稳定性和业务可持续性,通常比性能更重要;

  • 优化不可避免涉及到变更,变更就有风险;

  • 优化使性能变好,维持和变差是等概率事件;

  • 切记优化,应该是各部门协同,共同参与的工作,任何单一部门都不能对数据库进行优化!

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

c

优化由谁参与?

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

2

优化思路

 

a

优化什么?

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

  • 安全->数据可持续性;

  • 性能->数据的高性能访问。

b

优化的范围有哪些?

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

  • 主机架构稳定性;

  • I/O规划及配置;

  • Swap交换分区;

  • OS内核参数和网络问题。

应用程序方面:

  • 应用程序稳定性;

  • SQL语句性能;

  • 串行访问资源;

  • 性能欠佳会话管理;

  • 这个应用适不适合用MySQL。

数据库优化方面:

  • 内存;

  • 数据库结构(物理&逻辑);

  • 实例配置。

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

c

优化维度?

数据库优化维度有四个:

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

优化选择:

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

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

1

优化工具有啥?

 

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

作者:惨绿少年

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

END

IDEA 终于支持中文版和 JDK 直接下载了(太方便了)附新版介绍视频6大分布式定时任务对比除了负载均衡,Nginx 还能干啥?

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

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

相关文章

python 示例_是Python中带有示例的关键字

python 示例Python是关键字 (Python is keyword) is is a keyword (case-sensitive) in python, it is used to check whether two objects are the same objects or not. is是python中的关键字(区分大小写)&#xff0c;用于检查两个对象是否相同。 Note: If two variables re…

Linux Podman安装MySQL数据库

1.拉取MySQL镜像 这里拉取官方最新版本镜像 podman pull mysql2.查看本地镜像 podman images可以看到&#xff0c;我们已安装最新版本的mysql镜像 3.运行容器 可以使用以下命令来运行 mysql 容器 podman run -d --name mysql-test -p 4000:3306 -e MYSQL_ROOT_PASSWORD12…

不吹牛逼,撸个注解有什么难的

注解是 Java 中非常重要的一部分&#xff0c;但经常被忽视也是真的。之所以这么说是因为我们更倾向成为一名注解的使用者而不是创建者。Override 注解用过吧&#xff1f;Service 注解用过吧&#xff1f;但你知道怎么自定义一个注解吗&#xff1f;恐怕你会摇摇头&#xff0c;摆摆…

python二分法查找程序_Python程序查找地板划分

python二分法查找程序When we divide a number by another number – division operator (/) return quotient it may be an integer or float. But, when we need quotient without floating number – we can floor division (//) operator, it returns quotient (result) wi…

DOS命令(bat批处理脚本)遍历目录、遍历子目录下的文件、遍历数字和遍历文件内容

1.遍历目录 格式&#xff1a; for /d %%名称 in (路径) do 具体操作脚本测试&#xff1a;创建test.bat文件&#xff0c;*代表test.bat文件所在的当前目录 echo offfor /d %%a in (*) do (echo %%a)pause2.遍历目录和子目录下的文件 格式&#xff1a; for /r "目录路径&…

几位阿里朋友重写的Java并发编程,牛逼了

昨天在黄金时代群里和读者聊机械键盘大 F 的时候&#xff0c;好朋友 cxuan 推了一篇文章&#xff0c;吸引了我的眼球&#xff0c;名叫“太赞了&#xff0c;阿里几位工程师重写了 《Java 并发编程》”&#xff0c;我看完后&#xff0c;直呼“牛逼了”&#xff0c;就想着赶紧推荐…

FFmpeg 2.1 试用(新版支持HEVC,VP9)

2019独角兽企业重金招聘Python工程师标准>>> 前两天帮一位老师转码图像的时候&#xff0c;无意间发现新版FFmpeg竟然支持了下一代编码标准HEVC&#xff0c;以及Google提出的下一代编码标准VP9。真心没想到FFmpeg对下一代的编码标准支持的是如此之快。我还以为这两种…

电源变换适用于非独立源码_适用于非None测试的Python程序

电源变换适用于非独立源码As we have discussed in the previous post (Python None keyword), that "None" is a keyword which can be used to assign a null value to a variable or to check whether a variable contains any value or not. 正如我们在上一篇文章…

Linus shell 在一个脚本中调用另外一个脚本变量

1.新建public.sh文件&#xff0c;并添加以下内容&#xff1a; 2.新建ceshi.sh文件&#xff0c;并添加以下内容&#xff1a; 3.在终端赋予ceshi.sh文件执行权限&#xff0c;并运行该文件。

史上最全的延迟任务实现方式汇总!附代码(强烈推荐)

这篇文章的诞生要感谢一位读者&#xff0c;是他让这篇优秀的文章有了和大家见面的机会&#xff0c;重点是优秀文章&#xff0c;哈哈。 事情的经过是这样的... 不用谢我&#xff0c;送人玫瑰&#xff0c;手有余香。相信接下来的内容一定不会让你失望&#xff0c;因为它将是目前…

linux定时任务生产java服务无法执行问题群友案例

linux定时任务crond export变量问题群友案例来自网友兄弟 北京Grady(254553457) 的总结。1&#xff09;我写了一个重启resin的脚本&#xff0c;由于业务原因&#xff0c;需要定时在某一个时间重启下resin服务器&#xff0c;于是就在crontab里配置了如下内容&#xff1a;50 17 *…

在Python中执行while循环

Python执行while循环 (Python do while loop) Like other programming languages, do while loop is an exit controlled loop – which validates the test condition after executing the loop statements (loop body). 像其他编程语言一样&#xff0c; do while循环是退出控…

Windows DOS命令 bat批处理脚本交互操作

set的主要作用是赋值 set /p optEnter your option:先显示Enter your option:&#xff0c;再接收用户输入的内容,以回车表示结束&#xff0c;赋值给变量opt 实例测试&#xff1a; echo offecho 1.show ip address echo 2.show directory:main set /p optEnter your option:i…

面经分享:历时半个月,终于拿到了蚂蚁金服的offer!

在今天&#xff0c;我收到了蚂蚁金服A级的实习录用offer。从开始面试到拿到口头offer&#xff08;四面技术一面HR&#xff09;战线大约拉了半个月&#xff0c;从拿到口头offer到收到正式录用邮件大概又是半个月。思前想后&#xff0c;决定还是做一个整理与总结。一方面是回顾并…

将String转换成InputStream

String str "";//add your string contentInputStream inputStream new ByteArrayInputStream(str.getBytes());

bat批处理脚本获取window系统所有用户名并设置密码,禁用Guest账户

net user可以获取系统用户名&#xff0c;如下&#xff1a; 可以编写代码&#xff0c;bat批处理脚本获取window系统所有用户名并设置密码&#xff0c;如下&#xff0c;如果bat文件有中文&#xff0c;在cmd中执行会出现乱码&#xff0c;解决方法是用记事本打开bat文件&#xff0…

Python中的Dask数组

Python Dask数组 (Python Dask Array) Dask is parallel computing python library and it is mainly used to run across multiple systems. Dask is used to process the data efficiently on a different cluster of machines. Dask can completely use all the cores avail…

Spring IoC?看这篇文章就够了...

前言刚开始听到 IoC&#xff0c;会觉得特别高大上&#xff0c;但其实明白原理了很简单。跟着我的脚步&#xff0c;一文带你吃透 IoC 原理。本文围绕 是何、为何、如何 来谈&#xff1a;是何上一篇文章有同学问我在官网该看哪些内容&#xff0c;怎么找的&#xff0c;那今天的截图…

交换机arp转ip-mac绑定命令工具-免费版

一、简介 为了防止ARP攻击&#xff0c;我们经常需要在三层交换机上做IP地址与MAC地址的绑定操作。 先要进入System-View系统视图模式&#xff0c;输入"sys"即可。 system-view: [huawei]arp static 192.168.60.58 7813-3a79-d0aa在交换机上使用dis arp命令可以查看…

《纵向切入ASP.NET 3.5控件和组件开发技术》笔记:高效率事件集合对象

在之前讲的几个例子中&#xff0c;使用的是最普通的定义事件方法&#xff0c;比如KingTextBox中事件是这样定义的&#xff1a;/// <summary>/// 获得本书更多内容,请看:/// http://blog.csdn.net/ChengKing/archive/2008/08/18/2792440.aspx/// </summary>public e…