Mysql 性能优化——必胜之道
mysql的性能优化是运维和DBA们常常面对的问题,也是各大公司招聘人才时看中的要点之一。性能优化听上去很难,似乎只有大神才能做,然而,mysql的性能优化绝不是运维独自一个能完成的,DBA、开发、架构也要参与其中,齐心协力才能打赢性能优化之战。
本文将全面解说数据库优化的各个方面,主要也就是硬件、网络、系统、架构、软件这几个方面,其中软件主要包括软件版本、表设计、引擎、SQl语句、配置文件my.cnf等几个方面
一 硬件和网络
硬件和网络应该怎么优化呢?两个字“砸钱”!购买优质服务器,高性能多核cpu,高内存,高性能磁盘或者ssd盘等。硬件高配置是数据库高性能的基础,一般公司来说一台数据库机器配上72G内存已经足够了,具体配置也可根据公司的业务需求来添加。网络的基础配件性能越高越好,N兆光纤、N兆交换机、N兆网卡。当然,如果公司差钱,那就选择合适当前业务的基础配置即可。总之一句话:硬件与网络要用钱来优化!
二 系统
操作系统选择,首选当前流行稳定的版本,比如centos6.5 centos6.8,尽量少用5版本,如果公司处于整体环境升级阶段,可以直接换成最新的7版本,其性能优于5、6版本;如果不差钱也可以用redhat的相应版本,本人建议还是用centos吧,不花钱且社区活跃,方便后期管理升级。AIX系统不建议使用,至于什么原因,我只能送给AIX系统两个字“呵呵”。文件系统上尽量用ext4!
三 架构体系
mysql数据库的架构体系比较单纯,从单机到一主一从,再到一主多从,再到多主多从,再到读写分离,分级存储,分库分表,主要的形式也就这么多,具体怎么选择是根据业务需求而定,业务量较小的公司可以考虑一主多从,一般公司做到主从+读写分离就可以了,这样既有了性能也有了备份,数据量特别巨大的才用分库分表。
四 数据库版本控制
数据库版本与数据库的性能有着密切的关系,版本越高功能越丰富性能越强悍,但是高版本存在着可能未发现的隐患。目前大部分系统自带的mysql5.1,此版本稳定而悠久,在功能和性能要求不高的数据库环境中可以使用;不过企业环境中还是建议升级到mysql5.6以上版本,如果单机性能要求特高可以使用mysql5.7或者mariadb10.1或者percona5.7;mysql5.6在企业环境的应用较为普遍,性能也稳定,推荐使用这个版本;如果想使用最新版本的高性能数据库(据测5.7版本读写性能是5.6版本的2倍),推荐使用mariadb10.1,因为mysql企业版收费了,也有闭源的趋势。总结下:推荐使用mysql5.6或者mariadb10.1的相应版本。
高版本mysql5.7企业版,较之前版本功能性能的确有了较大提升:
1 在读模式下,3倍性能提升;在读写模式下,2倍性能提升。
2 默认开启ssl安全模式
>bin/mysql_ssl_rsa_setup 开启
3 Buffer_pool可以动态设置大小,无需重启
set global innodb_buffer_pool_size=256*1024*1024 ##设置256M
4 缓冲池预热
innodb_buffer_pool_dump_at_shutdown=1 innodb_buffer_pool_load_at_startup=1
5 支持全中文索引
6 支持死锁打印到错误日志 innodb_print_all_deadlocks=1
7 支持json格式数据存储
8 支持kill慢sql set global max_statement_time=1
9 支持日志审计 audit plugin
10 支持错误日志打印到系统日志文件中
五 表设计优化
关系数据库面临着范式的选择,最低满足第一范式:表中的字段都是单一属性,不可再分的;第二范式要求实体的属性完全依赖于主关键字;第三范式是不存在非关键字对任一候选主键的函数依赖;数据库的设计应当最大程度的满足三范式,当然三范式也是存在着问题的,它通常要很多join表,导致查询效率低下;有时候可以适当的做冗余,减少join,但要用审慎的态度对待!
表字段类型选择也是优化的重点。选取原则尽量是选小不选大,能用字节少的字段就不用大字段。更小的字段类型占用更少的内存,占用的磁盘和内存也会很小,占用的宽带也会少,所以做字段选择时候必须坚持“用小不用大”。比如主键,强烈推荐使用int整型。
数值类型一般常用的int(4个字节)和bigint(8个字节),比如手机号可用bigint,年龄用tinyint;字符类型最常用的有char(256)和varchar(65535),他们跟字符编码也有关系,latin1占用一个字节,gbk占用2个字节,utf8占用3个字节;时间类型常用date(3个字节)和datetime(8个字节)、timestamp(4个字节)。选择各种字段类型时候选择占用最少字节最适合的。
在线修改表结构,可以使用percona的工具pt-online-schema-change,不影响业务。
六 数据库引擎的选择
MyISAM和InnoDB是mysql数据库最常用的两种存储引擎,在5.5版本之前,默认是MyISAM,之后版本默认是InnoDB。两者的主要区别如下:
1 MyISAM是非事务安全型,InnoDB是事务安全型
2 MyISAM应用表级锁,开销小,InnoDB是行级锁,开销大,支持更好的并发写操作
3 MyISAM支持全文索引,Innodb在5.6版本以后才支持
4 MyISAM相对简单,管理方便,效率高,小型应用可以考虑使用MyISAM引擎
5 MyISAM表保存成文件形式,易于跨平台迁移
6 InnoDB比MyISAM更安全,可以随时从非事务切换到事务
据测,在同等配置下的压力测试中,InnoDB性能是MyISAM的10倍左右,所以在选着具有大量读写操作的应用中,推荐InnoDB优先使用引擎!
七 SQL语句优化
SQL语句决定着数据库70%的性能状况,大多数性能不好都是sql语句引起的。
普通硬件+普通配置+完美sql语句=一般性能
完美硬件+完美配置+垃圾sql语句=较差性能
完美硬件+完美配置+一般sql语句=一般性能
完美硬件+完美配置+完美sql语句=超优性能
1 定位慢SQL语句(记录)
开启慢日志功能,在my.cnf中添加配置:
slow_query_log=1
slow_query_log_file=mysql.slow
long_query_time=2 #超过两秒的记录下来
当数据库连接数较高时,就可以截取某段时间的满日志
sed -n '#time 2017-03-08 14:30:00/,/end/p' mysql.slow > slow.log
然后用mysqldumpslow 命令取出耗时间最长的10条慢sql分析
mysqldumpslow -s t -t 10 slow.log
2 优化not in子查询
用left join 代替not in 子查询
原语句:> select sql_cache count(*) from t1 where id not in (select id from t2);
优化: > select sql_cache count(*) from t1 left join t2 on t1.id=t2.id where t2.id is null;
3 优化like语句
在mysql中,like 'xxx%'可以用到索引,但是like '%xxx%'不能用到索引。
使用索引可以减少IO,提高性能。
原语句:> select * from t1 where name like '%game%';
优化: > select id from t1 where name like '%game%';
4 limit 分页优化
原语句: > select game * from t1 order by id limit 99,10;
优化: > select game * from t1 where id>=100 order by id limit 10;
5 优化count统计
利用辅助索引和distinct优化
原语句: > select count(*) from my_user;
优化: > select count(*) from my_user where id >=0;
> select count(*) from (select distinct k from my_user)tmp;
6 优化or语句
使用union all 代替or
原语句: > select * from user where name='a' or age=18;
优化: > select * from user where name='a' union all select * from user where age =18;
7 合理使用索引
八 my.cnf配置文件优化
配置文件内的可以设置的项很多,下面列出常常需要注意重要项
1 max_connections 最大连接数,默认100 ,一般设置500-1000即可。
2 innodb_buffer_pool_size,默认128M,可以设置为物理内存的60%-70%。
3 query_cache_size=64M query_cache_type=1 query_cache_limit=1M
4 wait_timeout=100 等待时长
5 connect_timeout=20 interactive_timeout=100
6 slow_query_log=1 开启慢日志
7 thread_cache_size=64
8 relay_log_recovery=1 中继日志恢复
9 open_files_limit=28512
..........
具体配置参数需要根据硬件环境和业务需求去定。
结语:mysql性能优化是一项系统庞大的工程,需要运维、架构、开发等多方参与共同改进,切勿盲目做调优处理,认真分析性能瓶颈所在,针对瓶颈处调优方能事半功倍!
转载于:https://blog.51cto.com/10672221/1952247
Mysql 性能优化——必胜之道相关推荐
- 《MySQL性能优化和高可用架构实践》简介与推荐序
#好书推荐##好书奇遇季#<MySQL性能优化和高可用架构实践>,京东当当天猫都有发售.腾讯云架构师宋立桓倾情奉献,定价59元,网店打折销售其实没多少钱. 互联网公司里面几乎很少有公司不用 ...
- Mysql性能优化方案
2019独角兽企业重金招聘Python工程师标准>>> 内容简介:这是一篇关于mysql 性能优化的文章.网上有不少mysql 性能优化方案,不过,mysql的优化同sql serv ...
- mysql半连接_mysql表的半连接,反连接导致的mysql性能优化剖析
[导读] 关于Oracle的半连接,反连接,我一直认为这是一个能讲很长时间的话题,所以在我的新书<Oracle DBA工作笔记>中讲性能优化的时候,我花... 关于Oracle的半连接,反 ...
- 记一次mysql性能优化过程
2019独角兽企业重金招聘Python工程师标准>>> 转发自:记一次mysql性能优化过程 由于配置是运行过那么长时间,很稳定,基本上不考虑,所以本次主要是sql的优化,并且集中在 ...
- MySQL 性能优化,优化设计及设计原则解读
MySQL性能优化的目的 如何合理的设计数据库? 什么样的数据库设计才能给后期DBA优化提供基石? 数据库设计与程序设计的差异? 数据库设计早期优化 1. 关系明确(理清表之间的关系,可以通过冗余的方 ...
- MySQL性能优化速记
MySQL性能优化速记http://www.bieryun.com/3064.html 总结自<MySQL 5.7从入门到精通(视频教学版)>刘增杰编著. 优化简介 MySQL数据库优化是 ...
- MySQL 性能优化技巧
原文地址:MySQL 性能优化技巧 博客地址:www.extlight.com 一.背景 最近公司项目添加新功能,上线后发现有些功能的列表查询时间很久.原因是新功能用到旧功能的接口,而这些旧接口的 S ...
- MySQL · 性能优化· InnoDB buffer pool flush策略漫谈
MySQL · 性能优化· InnoDB buffer pool flush策略漫谈 背景 我们知道InnoDB使用buffer pool来缓存从磁盘读取到内存的数据页.buffer pool通常由数 ...
- 常见mysql性能优化方法
mysql性能优化: 1.为查询缓存优化你的查询 2.explain你的查询 3.当只要一行数据的时候使用limit 1 4.为搜索字段建立索引 5.千万不要order by rand() 6.避免s ...
最新文章
- python【洛谷算法题单-搜索】P1605 迷宫
- 解决JS浮点数(小数)计算加减乘除的BUG
- 8、play框架中持久层操作
- warning: expression result unuesd 可能原因是函数忘了加括号,
- android:layout 冒号,android-json解析及简单例子(补汉6个汉字字).pdf
- 【数据结构与算法】链式栈的Java实现
- 集群类型以及提高服务器性能的技术概述
- 微信公众号之生成带参数的二维码
- AutoCAD2020布局和模型窗口背景色都修改为黑色
- 电路模电数电知识点总结(初步完成,后期进行小部分优化)
- 体检导检系统服务器系统,喜仕达体检中心导检系统
- 基于egret的点光源光线效果的实现
- Unity教程2D入门:25 主菜单MainMenu
- 中国人为何无缘诺贝尔奖
- Linux下配置Java环境-------从买来云服务器到运行一个jar包--------建立一个简单网站
- 【腾讯敏捷转型NO.1】敏捷是什么鬼?
- SoC第一讲——Vivado的Block Design 的使用
- 最全总结图论在识别人脑网络连通性模式中的应用——相关与相关性,主成分分析,聚类分析,互信息,格兰杰因果分析,动态因果模型,贝叶斯网络,转移熵
- 区块链与金融IT“联姻”的思路和方案
- 远程进服务器怎么全屏显示,远程服务器如何全屏显示