mysql 热块_mysql 优化

数据库层面:应用系统层面优化SQL优化

SQL优化一般通过分析慢查询日志来抓取长事务高消耗的sql,通过结合具体业务,对sql逻辑进行分析and精简,or重写sql。通过配置slow_query_log=1和log_queries_not_using_indexes=1启动慢查询日志记录和记录下没有使用索引的查询,后者会让慢查询日志文件很快膨胀,需要定时对文件进行切割。分析慢日志的工具一般使用pt工具包的pt-query-digest或者mysql自带的mysqldumpslow,个人比较倾向用pt,分析出来的内容比较详细。需要注意pt-query-digest其实是一个perl脚本,如果慢日志文件较大(几G多),需要大量消耗CPU资源。建议在业务低峰时候调度该工具。

索引优化

索引是数据库最为常见的对象。基本上90%的sql性能问题都是没有建索引or低效索引导致的。所以根据实际业务场景建合适的索引,能够使得sql优化事半功倍。

索引的设计规则:选择唯一性索引or主键;为经常需要排序、分组和联合操作的字段建立索引,尽量建立复合索引而非单列索引;为常作为查询条件的字段建立索引;限制索引的数目;尽量使用数据量少的索引;尽量使用前缀来索引;删除不再使用或者很少使用的索引。

创建索引的一些注意事项:

(1)避免在where子句中使用!=或者<>操作符,否则引擎会放弃索引而进行全表扫描

(2)避免在where子句中使用or来连接条件,考虑用union代替。

(3)避免在where子句中对字段进行表达式操作或者函数操作

(4)先应考虑在 where 及 order by 涉及的列上建立索引

(5)在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件 时才能保证系统使用该索引, 否则该索引将不被使用,并且应尽可能的让字段顺序与索引顺序相一致。即最左原则。

(6)索引固然可以提高相应的 select 的效率,但是也需要成本去维护索引,因此表的索引个数并非越多越好,一般不要超过7个。

(7)如果使用到了临时表,在最后将所有的临时表显式删除时,先 truncate table ,然后 drop table ,这样可以避免系统表的较长时间锁定。

(8)避免频繁创建和删除临时表,以减少系统表资源的消耗。对于一次性事件, 最好使用导出表。

(9)最好不要给数据库留NULL,尽可能的使用 NOT NULL填充数据库.备注、描述、评论之类的可以设置为 NULL,其他的,最好不要使用NULL。

(10)对于varchar的字段创建索引,指定索引长度,避免创建全字段索引,可以通过count(distinct left(列名,索引长度))/count(*)计算区分度来确定索引长度。

(11)多表关联查询的时候,必须保证关联的字段有索引。而且字段的类型必须一致,避免由于隐式转换导致索引失效。

库表优化

举个例子:业务前期不注重表设计,导致日志、报文、图片这类数据都通过表的方式存储在数据库。而这类数据一般是通过text/blob等类型的字段存储,极易使得表容量暴增,而且很难去优化这类表的查询sql。需要做好库表设计,对图片、报文这类数据,改为通过mongodb等NOSQL数据库进行存储。或者将表的部分大字段进行拆分,单独出来一个表,通过冗余部分字段,实现表与表之间的数据关联(不建议通过mysql的外键约束实现关联,因为在高并发的情况下,会出现大量行锁影响数据库性能,强烈建议通过应用程序实现数据关联。)

采用统一的字符集和校验集,使用innodb引擎,表设计中采用与业务无关的自增ID列作为主键,减少存储过程and自定义函数,尽量不用text/blob这类字段类型。

表设计规范

请参考附件 阿里巴巴Java开发手册 和 58到家数据库30条军规解读 (https://www.oschina.net/question/54100_2231325)

数据库对象优化

内存配置优化

innodb缓冲池设置:innodb_buffer_pool_size,一般为整机内存的70%~80%

缓冲池脏页占比:innodb_max_dirty_pages_pct,默认为75%,建议按照业务场景进行设置。

强烈建议关闭query cache。通过配置文件设置query_cache_size = 0、query_cache_type = 0即可。

redo log缓冲区设置:innodb_log_buffer_size,如果没大事务,控制在8M-16M即可,生产环境目前配置到64M。

IO配置优化

sync_binlog:

sync_binlog=0,当事务提交之后,MySQL不做fsync之类的磁盘同步指令刷新binlog_cache中的信息到磁盘,而让Filesystem自行决定什么时候来做同步,或者cache满了之后才同步到磁盘。

sync_binlog=n,当每进行n次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。

sync_relay_log:

同sync_binlog参数功能一样,只不过对象是relay log而不是binlog。

innodb_flush_log_at_trx_commit:

如果innodb_flush_log_at_trx_commit设置为0,log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行.该模式下,在事务提交的时候,不会主动触发写入磁盘的操作。如果innodb_flush_log_at_trx_commit设置为1,每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去.如果innodb_flush_log_at_trx_commit设置为2,每次事务提交时MySQL都会把log buffer的数据写入log file.但是flush(刷到磁盘)操作并不会同时进行。该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作。

sync_master_info:

每间隔多少事务刷新master.info,如果是table(innodb)设置无效,每个事务都会更新

sync_relay_log_info:

每间隔多少事务刷新relay-log.info,如果是table(innodb)设置无效,每个事务都会更新

master_info_repository:

记录主库binlog的信息,可以设置FILE(master.info)或者TABLE(mysql.slave_master_info)

relay_log_info_repository:

记录备库relaylog的信息,可以设置FILE(relay-log.info)或者TABLE(mysql.slave_relay_log_info)

innodb_io_capacity:默认为200,如果是SSD盘,建议调整到5000

高并发设置

扩大文件描述符:

1、动态修改,重启失效,只能使用root,并且当前session有效:ulimit -n 65535

2、修改配置文件,永久生效,在/etc/security/limits.conf配置文件中增加:* soft nofile 65535

* soft nproc 65535

* hard nofile 65535

* hard nproc 65535

主机层面:

1、CPU

2、内存

(1)关闭NUMA特性。NUMA陷阱现象是当你的服务器还有内存的时候,发现它已经在开始使用swap了,甚至已经导致机器出现停滞的现象。这个就有可能是由于numa的限制,如果一个进程限制它只能使用自己的numa节点的内存,那么当自身numa node内存使用光之后,就不会去使用其他numa node的内存了,会开始使用swap,甚至更糟的情况,机器没有设置swap的时候,可能会直接宕机。所以,强烈建议在操作系统层面关闭NUMA特性。直接在/etc/grub.conf的kernel行最后添加numa=off即可。

(2)尽量配置高内存。这种mysql可以充分利用内存资源缓存热块数据,避免由于内存不足导致脏数据不断地刷盘从而产生IO瓶颈,也可以避免热块数据被挤出缓存区的情况发生。

(3)修改swappiness设置。swappiness是linux的一个内核参数,用来控制物理内存交换出去的策略.它允许一个百分比的值,最小的为0,最大的为100,改值默认是60.m.swappiness设置为0表示尽量少使用swap,100表示尽量将inactive的内存页交换到swap里或者释放cache。inactive内存的意思是程序映射着,但是”长时间”不用的内存。这个值推荐设置为1,设置方法如下,在/etc/sysctl.conf文件中增加一行:vm.swappiness = 1

3、磁盘IO

(1)尽量将数据文件和日志文件分开,各自承载相应的磁盘。避免日志刷盘和数据刷盘之间争用IO。

(2)尽量使用高IO的磁盘,或者使用raid10这类磁盘阵列,或者直接采用SSD盘

4、网络优化

集群内机器最好部署在同一内网or专线直连的网络环境,以保证低延迟,高吞吐的网络环境。避免由于网络问题导致的集群内脑裂or主从复制异常的情况。

操作系统层面:

1、文件系统

强烈建议采用xfs文件系统,ext4文件系统存在bug,触发会占用自身大部分IO,造成IO瓶颈。详见http://1057212.blog.51cto.com/1047212/1891734

优化文件系统挂载参数:文件系统挂载参数是在/etc/fstab文件中修改,重启时候生效。noatime表示不记录访问时间,nodiratime不记录目录的访问时间。barrier=0,表示关闭barrier功能。其中nobarrier是xfs文件系统特有,ext4文件系统并无此参数。

2、IO调度算法

NOOP:NOOP算法的全写为No Operation。该算法实现了最最简单的FIFO队列,所有IO请求大致按照先来后到的顺序进行操作。

CFQ:CFQ算法的全写为Completely Fair Queuing。该算法的特点是按照IO请求的地址进行排序,而不是按照先来后到的顺序来进行响应。

DEADLINE:DEADLINE在CFQ的基础上,解决了IO请求饿死的极端情况。除了CFQ本身具有的IO排序队列之外,DEADLINE额外分别为读IO和写IO提供了FIFO队列。读FIFO队列的最大等待时间为500ms,写FIFO队列的最大等待时间为5s。FIFO队列内的IO请求优先级要比CFQ队列中的高,,而读FIFO队列的优先级又比写FIFO队列的优先级高。优先级可以表示为:FIFO(Read) > FIFO(Write) > CFQ

一般mysql服务器的磁盘IO调度算法采用deadline,既可以保证IO请求不被饿死,又可以使得读IO的处理优先级大于写IO。

系统架构层面优化负载均衡

这里可以分为两类:

1、PXC or mysql cluster or mysql group replication这类数据库集群,由于支持多点写入的方式,这里的负载均衡可以实现读和写都均衡负载的情况,通过在数据库前端部署haproxy或者LVS的方式实现负载均衡。但是需要强调的是,目前这类型集群在多点写入的情况很容易产生锁冲突和更新丢失的情况,一般官方建议开启单点写入。也就是说,一般也只能实现单节点承载写操作,剩余节点均衡负载读操作。

2、mysql一主多从架构:由于主库必须单独承载写操作,故均衡负载只是针对于读操作。也是通过在数据库前端部署haproxy或者LVS的方式实现读操作负载均衡。

缓存

一般采用内存数据库如Redis、memcached同mysql结合,将热点数据放在内存数据库上实现高并发。可以参考博客:http://blog.csdn.net/stubborn_cow/article/details/50586990

分布式优化

分库分表:

这里也可以分为2类:

(1)通过前端应用代码逻辑实现的方式,实现表分拆的方式。这样做对应用程序的侵入性比较大,但是数据处理逻辑的过程把控在自己手上,有异常可以自主定位。

(2)通过中间件的方式实现,目前常用的mycat、cobar实现数据分片。

读写分离:

一般通过数据库中间件的方式实现,常用的中间件例如:maxscale、mycat、cobar、altas等

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

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

相关文章

vscode C++ 分文件、文件夹编译配置与错误解决

文章目录问题includesourceout配置过程遇到的问题与解决遇到的问题1解决步骤1. ctrl shift p2. 配置json文件修改task.json文件修改launch.json可能遇到的错误1. collect2: error: ld returned 1 exit status2. /mnt/d/tmp/c/source/add.cpp:3:10: fatal error: add.h: No su…

gc就是fullgc吗 major_线上出现fullgc问题如何排查?

1.问题描述线上出现fullgc报警&#xff0c;每5分钟一次2.背景知识1. 程序执行了System.gc()执行了jmap -histo:live pid命令 在执行minor gc的时候进行的一系列检查 执行Minor GC的时候&#xff0c;JVM会检查老年代中最大连续可用空间是否大于了当前新生代所有对象的总大小。 …

修改 jquery.validate.js 支持非form标签

尝试使用markdown来写一篇blog&#xff0c;啦啦啦 源代码传送门&#xff1a;github 在特殊情况下我们使用jquery.validate.js对用户输入的内容做验证的时候&#xff0c;表单并不是一定包含在form之中&#xff0c;有可能是一个div弹层&#xff0c;有可能是嵌套在form里面的一个d…

Linux常用文件和目录操作

cd:变换目录pwd:显示弼前目录mkdir:建立一个新目录rmdir:删除一个空目录 cp&#xff1a;复制目录或者文件 mv&#xff1a;移动文件或者目录 rm&#xff1a;删除文件或者目录 转载于:https://www.cnblogs.com/lijingpeng/archive/2012/09/07/2675982.html

淘淘商城项目mysql服务器_SpringMVC+Spring+Mybatis+Mysql+Maven+Svn[ 淘淘商城项目环境搭建 ]...

背景&#xff1a;淘淘商城项目的环境搭建说明&#xff1a;采用SpringMVCSpringMybatisMysqlMavenSvn结构搭建&#xff0c;在开发之中可以参考其结构和搭建步骤去搭建实际的工程项目工程结构简图&#xff1a;项目结构&#xff1a;---------------------------------------------…

bean validation校验方法参数_项目启动时首先校验Spring Boot配置参数

1. 概述在项目实际开发过程中&#xff0c;为了更好的复用&#xff0c;我们参考Spring Boot Starters&#xff0c;封装了许多企业内部中间件的starter。这些中间件的接入都需要申请并在项目中配置一些特定的参数。我们通过ConfigurationProperties注解&#xff0c;增加了在配置过…

进一步理解:inline-block,vertical-align,line-height

看似三个最常见的概念背后却隐藏了很深的很深“水” 那有多深呢&#xff0c;先来看下面的代码 引出问题 <style>.inline-block {display: inline-block;}.border {border: 1px solid #000000;}.span {width: 100px;height: 100px;}.bak {background: #33CCFF;} .o-hidden…

刷系统——黑屏问题

引用&#xff1a;http://www.miui.com/thread-344361-1-1.html 此贴大部分内容源自魔趣论坛V大的帖子&#xff0c;本人经过整理后发出&#xff0c;特此声明原帖地址&#xff1a;http://bbs.mfunz.com/thread-172610-1-1.html——此贴献给小白们&#xff0c;老鸟一笑而过吧近期有…

LeetCode OJ - Recover Binary Search Tree

题目&#xff1a; Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing its structure. Note:A solution using O(n) space is pretty straight forward. Could you devise a constant space solution? 解题思路&#xff…

mysql中间件是运维工作内容_linux运维工作的七项内容

一&#xff0c;【基础运维检查】或叫 例行检查 或叫 例行巡检mail cacti1.理解例行检查列表的内容、检查项的含义以及可能引发的问题。2.按照例行检查表&#xff0c;定期检查系统状态&#xff0c;发现异常立即通报并推进解决。3.定期检查线上服务模块&#xff0c;排除可疑进程,…

java executor_Java并发编程(08):Executor线程池框架

一、Executor框架简介1、基础简介Executor系统中&#xff0c;将线程任务提交和任务执行进行了解耦的设计&#xff0c;Executor有各种功能强大的实现类&#xff0c;提供便捷方式来提交任务并且获取任务执行结果&#xff0c;封装了任务执行的过程&#xff0c;不再需要Thread().st…

Exchange 2007迁移Exchange 2010应该注意的13件事

1. Exchange 2007可以支持升级到Exchange 2010&#xff0c;但需要提前将Exchange 2007所有服务器环境升级至 SP2或以上版本。2. Exchange 2007如果更新至SP2或以上版本&#xff0c;则建议按照以下顺序进行各角色的更新&#xff1a; CAS、UM、HUB、Edge、Mailbox。3. …

dom4j操作XML

(一&#xff09;创建Document的基本操作 /** * XML基本操作 */ public void BaseOperation(){ //创建一个document Document documentDocumentHelper.createDocument(); //创建根结点 Element rootdocument.addElement("root"); //为根结点添加一个book节点 Element …

Oracle数据库中闪回恢复的详细分析

Oracle9i开始提供闪回查询&#xff0c;以便能在需要的时候查到过去某个时刻的一致性数据&#xff0c;这是通过Undo实现的。这个功能有很大的限制&#xff0c;就是相关事务的undo不能被覆盖&#xff0c;否则就无力回天了。oracle10g大大的增强了闪回查询的功能&#xff0c;并且提…

python 查看当前目录_「Python」打包分发工具setuptools学习

❝setuptools是python标准的打包分发工具&#xff0c;它可以将我们编写的python项目打包安装&#xff0c;这样其他同事就可以像调用标准库或python第三方库那样直接使用&#xff1b;也可以将项目上传到Pypi供更多人的下载安装使用。❞1. 项目结构项目结构❝这是一个打包构建好的…

如何杀掉D状态的进程?[zt]【转】

转自&#xff1a;http://blog.csdn.net/chinalinuxzend/article/details/4288791 [-] 如何杀掉D状态的进程zt相关博文原贴:http://www.xclinux.cn/?p752 如何杀掉D状态的进程&#xff1f;[zt] 状态为 D (Uninterruptible sleep) &#xff0c;以及状态为 Z (Zombie)这些垃圾进程…

九月十月百度人搜,阿里巴巴,腾讯华为笔试面试八十题(第331-410题)

九月十月百度人搜&#xff0c;阿里巴巴&#xff0c;腾讯华为小米搜狗笔试面试八十题 &#xff08;参与算法&面试题交流与讨论&#xff0c;请加群&#xff1a;30382647&#xff09;引言 自发表上一篇文章至今&#xff08;事实上&#xff0c;上篇文章更新了近3个月之久&#…

mysql性能结构优化原理_MySQL性能管理及架构设计(二):数据库结构优化、高可用架构设计、数据库索引优化...

一、数据库结构优化(非常重要)1.1 数据库结构优化目的1、减少数据冗余&#xff1a;(数据冗余是指在数据库中存在相同的数据&#xff0c;或者某些数据可以由其他数据计算得到)&#xff0c;注意&#xff0c;尽量减少不代表完全避免数据冗余&#xff1b;2、尽量避免数据维护中出现…

python git是什么_python爬虫之git的使用

一、简单认识&#xff1a; 1、初始化文件夹为版本控制文件夹&#xff0c;首先建立一个文件夹&#xff0c;进入这个文件夹以后输入git init初始化这个文件夹。2、Git几种位置概念 1、本地代码&#xff1a;本地更改完代码以后&#xff0c;虽然是存放在git的文件夹里面&#xff0c…

产品经理网站数据分析之测量问题现状(二)

本章续接上文&#xff0c;主要讲解流程图的绘制要领&#xff0c;以及示例。 1、基础流程图 基础流程图应该简明扼要地描述出流程的主要结构&#xff0c;在弄清楚流程的起点、终点&#xff0c;以及主要步骤后&#xff0c;按照流程的先后顺序&#xff0c;按照要展示的流程长短比例…