数据库架构学习(二)什么影响了MySQL性能

1.服务器硬件的影响

包括:CPU,内存,磁盘IO等

2.服务器的操作系统的影响

3.数据库存储引擎的选择(插件式存储引擎)

MyISAM:不支持事务,表级锁。
InnoDB:事务级存储引擎,完美支持行级锁,事务AICD特性。

4.数据库服务器的配置参数(影响最为关键)

5.数据库结构设计和SQL语句的影响

数据库的优化重点在于数据库表结构设计和SQL语句的编写和优化


服务器硬件对性能的影响和优化

CPU和可用内存大小,网络和磁盘I/O

如何选择CPU?

CPU的频率和核心数的选择:

一些进程绝大多数时间在计算上,称为计算密集型(CPU密集型)computer-bound。
有一些进程则在input和output上花费了大多时间,称为I/O密集型,I/O-bound。比如搜索引擎蜘蛛大多时间是在等待相应这种就属于I/O密集型。

当应用是CPU密集型的时候,为了加快SQL语句的运行速度,应该选择更好的CPU而不是更多的。

衡量数据库处理能力的指标:QPS(同时处理SQL的数量)
当对并发量有要求的时候,则是增加核数。

64位架构上使用32位的服务器版本时(MySQL是单线程的)


如何选择内存?(内存的I/O远大于其他的)

把数据缓存到内存中进行读取,可以大大提升数据库的性能

在常用的MySQL存储引擎中
MyISAM:
会将索引缓存到内存
将数据通过操作系统进行缓存
InnoDB:
会同时在内存中缓存数据和索引,从而提高数据库的效率

我们需要明白一点,内存对性能的影响是有限的,并不能无限的增加性能。
数据库可以利用的内存是有限的,一般当缓存的数据和磁盘的数据一样时,即所有的数据被缓存到内存后,再增加内存的大小是没有意义的。

内存的主频和服务器的主频一致


磁盘的配置和选择

常用磁盘I/O:

  • 使用传统机器硬盘
  • 使用RAID增强传统机器硬盘的性能
  • 使用固态存储SSD和PCIe卡
  • 使用网络存储NAS和SAN

传统机器磁盘:最常见,使用最多,价格低,存储空间大,读写较慢(读写速度却决于工作机制)

传统机器硬盘读取数据的过程:
1,移动磁头到磁盘表面上的正确位置
2,等待磁盘旋转,使所需的数据再磁头之下
3,等待磁盘旋转过去,所有所需的数据都被磁头读出

1,2步称为访问时间,3步称为传输速度

如何选择传统机器磁盘:
1,磁盘容量
2,传输速度
3,访问时间快的
4,主轴转速快的
5,物理尺寸(越小的时间越短)


使用RAID增加传统机器硬盘的性能

什么是RAID:
RAID是磁盘冗余队列的简称(Redundant Arrays of Independent Disks)简单的说RAID的作用就是将多个容量较小的磁盘组成一组容量更大的磁盘,并提供数据冗余来保证数据完整性的技术。(增加传输速率)
RAID1(日志)的读写比RAID0(临时的)要快,RAID5的写较慢(要写校验位)写较快(使用在从服务器)。


使用网络存储SAN和NAS

SAN(Storage Area Network)和NAS(Network-Attached Storage)是两种外部文件存储设备加载到服务器上的方法。

关于SAN:
SAN设备通过光纤连接到服务器,设备通过光纤接口访问,服务器可以将其当作硬盘使用。
SAN能够支持大量顺序读写,这些读写I/O能够缓存和I/O合并。然而随机读写慢,不如本地RAID磁盘。

关于NAS:
NAS设备使用网络连接,通过基于文件的协议如NFS或SMB来访问。(受限于网络)

网络存储的使用场景

  • 数据库备份

网络性能的限制:延迟 带宽

建议:

  • 采用高性能和高带宽的网络接口设备和交换机
  • 多网卡进行绑定,增强可用性和带宽
  • 尽可能的进行网络隔离(内外网隔离,企业网和管理的网络隔离)

服务器硬件对性能的影响的总结:

CPU

  • 64位的CPU一定要工作在64位的系统下
  • 对于并发比较高的场景CPU的数量比频率重要
  • 对于CPU密集型场景和复杂SQL则频率越高越好

内存

  • 选择主板所能使用的最高频率的内存
  • 内存的大小对性能很重要,所以尽可能的大(足够的内存可以把大量的随机I/O变成顺序I/O,并对读写数据进行缓存,把多次写变成一次写)

I/O子系统

  • PCIe->SSD->Raid10->磁盘->SAN(随机读写性能)

操作系统对性能的影响

Windows :数据库中对大小写不敏感,而Linux则是敏感的

CentOS系统参数优化

内核相关参数(/etc/sysctl.conf)

net.core.somaxconn = 65535 #端口的最大监听数量
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_max_syn_backlog = 65535

net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
以上三个加速tcp连接的回收

net.core.wmem_default = 87380
net.core.wmem_max = 16777216
net.core.rmem_default = 87380
net.core.rmem_default = 16777216
以上四个参数设定了TCP接受和发送缓冲区的默认值和最大值

net.ipv4.tcp_keepalive_time =120
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
以上三个参数用于减少失效连接占据tcp的资源,加快资源回收

有关内存的几个参数:
kernel.shmmax = 4294967295
Linux内核参数中最重要的参数之一,用于定义单个共享内存段的最大值。
注意:
这个参数应该设置足够大,以便能够在一个共享内存段下容纳整个的Innodb缓冲池的大小。
这个值的大小对于64位Linux系统,可取的最大值为物理内存值 -1byte,建议值为大于物理内存的一半,一般取值大于Innodb缓冲池的大小即可。

vm.swappiness = 0
这个参数决定了当内存不足的时候会对性能产生比较明显的影响
该参数设置为0表示除非虚拟内存完全满了,否则不会使用交换分区。

增加资源限制(/etc/security/limit.conf)

这个文件实际上是Linux PAM也就是插入式认证模块的配置文件。
可以配置打开文件数的设置
* soft nofile 65535
* hard nofile 65535
以上两个参数用于打开文件数的限制,加到limit.conf文件的末尾即可
* 表示对所有用户有效
soft 指的是当前系统生效的设置(对于同一资源,soft的值不能比hard高)
hard 表明系统中所能设定的最大值
nofile 表示所限制的资源是打开文件的最大数目
65535 就是限制的数量

注意:这个文件的修改需要重启系统

磁盘调度策略(/sys/block/devname/queue/scheduler)

cat /sys/block/devname/queue/scheduler
noop anticipatory deadline [cfq]

noop(电梯式调度策略)
NOOP实现了一个FIFO队列,它像电梯的工作方式一样对I/O请求进行组织,当有一个新的请求到来时,它将请求合并到最近的请求之后,以此来保证请求同一个介质。NOOP倾向于饿死读而利于写,因此NOOP对于闪存设备,RAM以及嵌入式是最好的选择。

deadline(介质时间调度策略)
Deadline确保了在一个截至时间内服务请求,这个截至时间是可调整的,而默认读期限短于写期限。这样就防止了写操作因为不能被读取而饿死的现象。Deadline对数据库类应用是最好的选择。

anticipatory(预料I/O调度策略)
本质上与Deadline一样,但在最后一次读操作后,要等待6ms,才能继续进行对其他I/O请求进行调度。它会在每个6ms中插入新的I/O操作,而会将一些小写入流合并成一个大写入流,用写入延时换取最大的写入吞吐量。AS适合于写入较多的环境,比如文件服务器,AS对数据库环境表现很差。

通过下面方法修改磁盘策略:
echo deadline > /sys/block/devname/queue/scheduler

你可能感兴趣的:(数据库架构学习(二)什么影响了MySQL性能)