菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
3221
0

MySQL 优化

原创
05/13 14:22
阅读数 2310

mysql服务器和配置优化

  • 存储层:存储引擎、字段类型选择、范式设计
  • 设计层:索引、缓存、分区(分表)
  • 架构层:多个mysql服务器设置,读写分离(主从模式)
  • sql语句层:多个sql语句都可以达到目的的情况下,要选择性能高、速度快的sql语句

存储层

存储引擎

  • innodb存储引擎:适合做修改、删除,并发性高,行锁,支持事务
  • Myisam存储引擎:适合做查询、写入

字段类型选择

  • 占据空间小、数据长度最好固定、数据内容最好为整型的

设计层

缓存

如果该sql语句被频繁执行获得数据(这些数据还不经常发生变化),为了使得每次获得的信息速度较快,就可以把“执行结果”给缓存起来,供后续的每次使用

分表

水平分表

单个表中数据太多,将单个数据库表进行拆分,拆分成多个数据表,然后用户访问的时候,根据一定的算法,让用户访问不同的表,这样数据分散到多个数据表中,减少了单个数据表的访问压力。提升了数据库访问性能。

垂直分表

举例说明,在一个博客系统中,文章标题,作者,分类,创建时间等,是变化频率慢,查询次数多,而且最好有很好的实时性的数据,我们把它叫做冷数据。而博客的浏览量,回复数等,类似的统计信息,或者别的变化频率比较高的数据,我们把它叫做活跃数据。

  • 存储引擎的使用不同,冷数据使用MyIsam 可以有更好的查询数据。活跃数据,可以使用Innodb ,可以有更好的更新速度。
  • 对冷数据进行更多的从库配置,因为更多的操作是查询,这样来加快查询速度。对热数据,可以相对有更多的主库的横向分表处理。
  • 对于一些特殊的活跃数据,也可以考虑使用memcache ,redis之类的缓存,等累计到一定量再去更新数据库.

服务器调整优化

  • 关闭不必要的二进制日志和慢查询日志,仅在内存足够或开发调试时打开,慢查询会消耗过度消耗CPU,可以间歇性打开慢查询日志来定位新能瓶颈
  • 因为生产环境中,数据库大多都是读操作,所以部署一主多从架构,主数据库负责写操作,并做双击热备,多台从数据库做负载均衡,负责读操作,主流的负载均衡器有LVS、HAProxy、Nginx。怎么来实现读写分离呢?大多数企业是在代码层面实现读写分离,效率比较高

服务器性能监控

super-smack:压力测试工具

  • 连接数
  • QPS,Queries Per Second:每秒查询数,一台数据库每秒能够处理的查询次数
  • TPS,Transactions Per Second:每秒处理事务数

通过show status查看运行状态,会有300多条状态信息记录,其中有几个值帮可以我们计算出QPS和TPS,如下:

  • Uptime:服务器已经运行的实际,单位秒
  • Questions:已经发送给数据库查询数
  • Com_select:查询次数,实际操作数据库的
  • Com_insert:插入次数
  • Com_delete:删除次数
  • Com_update:更新次数
  • Com_commit:事务次数
  • Com_rollback:回滚次数

那么,计算方法来了,基于Questions计算出QPS:

mysql> show global status like ``'Questions'``;

mysql> show global status like ``'Uptime'``;

  QPS = Questions / Uptime

  基于Com_commit和Com_rollback计算出TPS:

mysql> show global status like ``'Com_commit'``;

mysql> show global status like ``'Com_rollback'``;

mysql> show global status like ``'Uptime'``;

  TPS = (Com_commit + Com_rollback) / Uptime

  另一计算方式:基于Com_select、Com_insert、Com_delete、Com_update计算出QPS

mysql> show global status where Variable_name ``in``(``'com_select'``,``'com_insert'``,``'com_delete'``,``'com_update'``);

  等待1秒再执行,获取间隔差值,第二次每个变量值减去第一次对应的变量值,就是QPS

  TPS计算方法:

mysql> show global status where Variable_name ``in``(``'com_insert'``,``'com_delete'``,``'com_update'``);

  计算TPS,就不算查询操作了,计算出插入、删除、更新四个值即可。

  经网友对这两个计算方式的测试得出,当数据库中myisam表比较多时,使用Questions计算比较准确。当数据库中innodb表比较多时,则以Com_*计算比较准确。

性能优化
数据库中查询记录时是否每次只能使用一个索引?
分表和分区的区别

发表评论

0/200
3221 点赞
0 评论
收藏
为你推荐 换一批