1.影响mysql性能的因素

####问:影响mysql性能的因素有哪些?
答:

  1. 服务器硬件
  2. 磁盘io
  3. 网卡流量
  4. 操作系统(32位,64位,系统不同性能不同,另外操作系统的一些参数也会影响db性能)
  5. mysql存储引擎(一主多从,两主多从等等)
  6. mysql架构设计( innodb,myisam,archive 等等)
  7. mysql表格设计(影响挺大)
  8. 日志文件格式(二进制日志格式,基于段的格式STATEMENT,基于行的格式ROW)
  9. sql查询速度(慢查询,工作中这个接触较多)
  10. 大事务(运行时间长,或操作数据量大)
  11. 大表(记录行数巨大,单表超过千万行。或表文件巨大,超过10G)

前3者均可通过更换更好的硬盘解决,日常工作中主要通过优化 4-11 这些点来提高服务性能。
但第6点也不是绝对的,比如该表只是记录日志,几乎没有 update 和 delete 操作,就算超过千万行数据,对业务影响也不大。



####问:硬件影响性能的方面?
答:

  1. 硬盘(机械,固态)
  2. 内存
  3. RAID等级

一般来说:对于读写比较频繁的,适合选择RAID10。对于不频繁的,比如从库,可以选择RAID 0 或者 RAID 5,但要小心 RAID 5 出现磁盘损坏后,带来 IO 大幅下降,所带来主从大幅延迟问题。



####问:操作系统对db性能的影响?
答:在选择操作系统时,要选择专为 服务器 设计的版本,而不是桌面版本

下面列举一些 centos 系统影响db的部分参数:

net.core.somaxconn = 65535
决定最大监听队列的长度(tcp连接)
这参数系统默认很小,对于负载大的服务器来说不够,一般来说设置成2048
*

以上3个主要用于加快tcp连接的回收
*

决定tcp连接 接收和发送 缓冲区大小的默认值和最大值,对于db服务器来说,应该把这几个参数调整大点
*

用于减少失效连接tcp 所占用的系统资源,加快资源回收的效率
*



####问:文件系统对性能的影响?

EXT3,EXT4,XFS都是有日志功能的,日志功能对日志的安全性非常重要,更适合db,传闻XFS性能更高,所以建议使用XFS文件系统



####问:mysql表设计哪些会对性能造成不好的影响?

  1. 过度的反范式化为表建立太多的列
  2. 过分的范式化造成太多的表关联
  3. 在OLTP环境中使用不恰当的分区表
  4. 使用外键保证数据的完成性


####问:大表对性能的影响?
答:
建立索引需要较长时间
(mysql5.5之前版本建立索引会锁表,5.5之后不会锁表但会造成较大主从延迟)
修改表结构会造成长时间的锁表

问:如何优化?
答:1. 分库分表; 2. 历史数据归档

分库分表难度在于分表主键的选择和分表后数据的跨分区查询和统计。
比如 分表后,如果数据不能比较平均的分布,还是主要集中在那几个表,这样对业务性能的提升并不高,反而还会增加查询统计的难度。

历史数据归档:将部分数据归档到另外的数据数
比如 日志数据,可以选择在一个月后将数据归档到另一个数据库
比如 订单数据,可以选择一年后的数据归档到另一个数据库
另外,核心数据库归档数据库 可以放在不同的服务器,减少 核心服务器 的压力
再在前端增加一个历史记录查询的接口,方便统计人员统计。对后端人员来说,已经归档的订单,一般都是正常完成交易的订单,对后端的统计也没什么影响。
难度在于归档操作时,需要将数据剪切到另外的数据库,操作的数据量教大,有难度,轻则产生主从延迟,重则影响主业务的使用



####问:大事务的影响?
答:锁定太多的数据,造成大量的阻塞和锁超时,回滚时所需时间比较长,造成主从延迟。

优化方法是避免一次处理太多数据,另外移出不必要在事务中的 select 操作



####总结:
在日常工作中,一般优化 db 性能的顺序如下

  1. 数据库表结构设计和 sql 语句
  2. 数据库 存储引擎 的选择和 参数配置
  3. 系统选择 及 优化
  4. 硬件升级