2. 影响mysql性能的因素

我的梦境 提交于 2020-03-08 17:32:57

影响mysql性能的几个方面:

1. 服务器硬件

2. 服务器操作系统

3. 数据库存储引擎

4. 数据库参数配置

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

  • 服务器硬件:
1. CPU:

    CPU密集型的应用,应选用频率更高的CPU而不是更多的CPU
    WEB类的应用,CPU核心数量比频率重要

2. 内存:

    内存越多越好,内存对读、写都有作用
    内存频率越高速度越快,应选择主板支持的最大内存频率,单条容量尽可能大
    
3. 磁盘:

    传统机器硬盘:1.存储容量 2.传输速度 3.访问时间 4.主轴转速 5.物理尺寸
    
    RAID(磁盘冗余阵列):
        1.RAID 0,2块以上的硬盘组成,没有冗余和错误修复能力
        2.RAID 1,磁盘镜像,2块硬盘组成,有冗余
        3.RAID 5,分布式奇偶性校验阵列,3块以上的硬盘组成,任意一个盘数据失效时可以重建,更多盘数据失效时无法重建
        4.RAID 10,分片镜像,RAID 0和RAID 1组合,4块以上的硬盘组成,对比RAID 5重建更简单,速度更快
        
    固态存储SSD或PCI-E卡:
        比机械硬盘有更好的随机读写性能
        比机械硬盘能更好的支持并发
        比机械硬盘更容易损坏
        
        适用于存在大量随机I/O的场景
        适用于解决单线程负载的I/O瓶颈
    
    网络存储SAN和NAS:
        SAN的随机读写慢,不如本地RAID磁盘
        NAS设备使用网络连接,通过基于文件的协议如NFS或SMB来访问
        
        适用于数据库备份,不适于用数据库直接存储

4. 网络:
    
    采用高性能和高带宽的网络接口设备和交换机
    对多个网卡进行绑定,增强可用性和带宽

RAID级别的选择:

等级 特点 冗余 盘数
RAID 0 便宜、快速、危险 N
RAID 1 高速读、简单、安全 2
RAID 5 安全、成本适中 N+1 取决于最慢的盘
RAID 10 贵、高速、安全 2N

总结:

CPU

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

    选择主板所能使用的最高频率的内存
    内存的大小对性能很重要,所以要尽可能的大

I/O子系统
    
    PCIe → SSD → RAID 10 → 磁盘 → SAN
    
网络
    网络带宽越高越好,网络设备性能尽可能的好
  • 服务器操作系统:

mysql适合运行的操作系统:Windows、FreeBSD、Solaris、Linux(CentOS、Ubuntu、Debian),建议使用CentOS作为mysql服务器的操作系统。

  • CentOS系统参数优化:

内核参数优化(/etc/sysctl.conf):

net.core.somaxconn=65535                #一个端口最大的监听队列长度
net.core.netdev_max_backlog=65535               #当每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包的最大数目
net.ipv4.tcp_max_syn_backlog=65535              #表示SYN队列长度

net.ipv4.tcp_tw_reuse=1             #开启重用,允许将TIME-WAIT sockets重新用于新的TCP连接
net.ipv4.tcp_tw_recycle=1               #开启TCP连接中TIME-WAIT sockets的快速回收
net.ipv4.tcp_fin_timeout=10             #FIN_WAIT_2状态的超时时长

net.core.wmem_default=87380             #默认的TCP数据接收窗口大小
net.core.wmem_max=16777216              #最大的TCP数据接收窗口大小
net.core.rmem_default=87380             #默认的TCP数据发送窗口大小
net.core.rmem_max=16777216              #最大的TCP数据发送窗口大小

net.ipv4.tcp_keepalive_time=120             #当keepalive起用的时候,TCP发送keepalive消息的间隔,单位为s
net.ipv4.tcp_keepalive_intvl=30             #如果对方不予应答,keepalive探测包的发送间隔
net.ipv4.tcp_keepalive_probs=3              #如果对方不予应答,探测包的发送次数

kernel.shmmax=4294967295                #定义单个共享内存段的最大值。建议该值设置足够大,以便能在一个共享内存段下容纳下整个Innodb缓冲池的大小
vm.swappiness=0             #值越大,表示越积极使用swap分区,越小表示越积极使用物理内存。为0时表示除非虚拟内存完全占满,否则不使用交换分区

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

* soft nofile 65535             #增加到文件末尾
* hard nofile 65535
*           表示对所有用户有效
soft        指的是当前系统生效的配置
hard        表明系统中所能设定的最大值
nofile      表示所限制的资源是打开文件的最大数目
65535       限制的数量

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

cfq(完全公平队列策略) 默认调度策略

noop(电梯式调度策略) FIFO队列,倾向饿死读而利于写

deadline(截止时间调度策略) 确保在一个截止时间内服务请求,默认读期限短于写期限,deadline适用于数据库类应用

anticipatory(预料I/O调度策略) 与deadline类似,适合写入较多的环境,如文件服务器,不适合数据库环境
echo deadline > /sys/block/sda/queue/scheduler              #修改磁盘sda的调度策略为deadline

文件系统:

Windows
    FAT
    NTFS

Linux
    EXT3
    EXT4
    XFS

    EXT3/4系统的挂载参数(/etc/fstab):
    /dev/sda1/ext4 noatime,nodiratime,data=writeback 1 1
  • mysql存储引擎:

MyISAM

mysql5.5版本之前默认的存储引擎,MyISAM存储引擎表由MYD和MYI组成。

特性:
    支持表级锁,读写混合操作的并发性支持较差
    表的损坏修复可能会丢失数据
        check table table_name
        repair table table_name
    MyISAM表支持全文索引
    MyISAM表支持数据压缩
        命令行:myisampack -b -f filename

限制:
    版本低于5.0时,默认表大小为4GB;版本高于5.0时,默认表大小为256TB
    如果存储大表,则要修改MAX_Rows和AVG_ROW_LENGTH
    
适用场景:
    非事务型应用
    只读类应用
    空间类应用

Innodb

mysql5.5版本之后默认的存储引擎,Innodb使用表空间进行数据存储,
由 innodb_file_per_table 参数决定,ON表示独立表空间,OFF表示系统表空间。

优缺点对比:

    1. 系统表空间无法简单的收缩文件大小,容易造成磁盘空间浪费并产生大量的磁盘碎片;
       独立表空间可以通过 optimize table 命令收缩系统文件。

    2. 系统表空间会产生IO瓶颈;独立表空间可以同时向多个文件刷新数据。

对于Innodb,建议使用独立表空间。

将系统表空间中的表转移到独立表空间中的步骤:

1. 使用 mysqldump 导出所有数据库数据
2. 停止mysql服务,修改参数,并删除Innodb相关文件
3. 重启mysql服务,重建Innodb系统表空间
4. 重新导入备份的数据

特性:
    Innodb是一种事务型存储引擎
    完全支持事务的ACID(原子性、一致性、隔离性、持久性)特性
    Innodb支持行级锁,行级锁是在存储引擎层实现的,行级锁可最大程度的支持并发

适用场景:
    Innodb适合大多数OLTP应用
什么是锁?
    锁的主要作用是管理共享资源的并发访问
    锁用于实现事务的隔离性

锁类型:
    共享锁(读锁)
    独占锁(写锁)

锁粒度:
    表级锁,开销小,并发性低
    行级锁,开销大,并发性高
    
阻塞和死锁:
    阻塞,是指一个事务中的锁需要等待另一个事务中的锁占用的资源释放
    死锁,是指两个或两个以上的事务在执行过程中相互占用了对方等待的资源而产生的异常

CSV

文件引擎存储特点:
    数据以文本方式存储在文件中,.CSV 文件存储表内容,.CSM 文件存储表的元数据如表状态和数据量,.frm 文件存储表结构信息
    
特点:
    以CSV格式进行数据存储
    所有列必须都是不能为NULL的
    不支持索引,不适合大表,不适合在线处理
    可以对数据文件直接编辑
    
适用场景:
    适合作为数据交换的中间表

Archive

文件引擎存储特点:
    以zlib对表数据进行压缩,磁盘I/O更少。数据存储在以ARZ为后缀的文件中
    
特点:
    只支持 INSERT 和 SELECT 操作
    只允许在自增ID列上加索引

适用场景:
    日志和数据采集类应用

Memory

文件引擎存储特点:
    也称为HEAP存储引擎,所以数据保存在内存中
    
特点:
    支持HASH索引和Btree索引,默认是HASH索引,HASH索引有利于等值查找,而Btree索引有利于范围查找
    所有字段都为固定长度,varchar(10)=char(10)
    不支持BLOG和TEXT等大字段
    Memory存储引擎使用表级锁
    最大大小有 max_geap_table_size 参数决定,默认为16M

适用场景:
    用于查找或是映射表,例如邮编和地区的对应表
    用于保存数据分析中产生的中间表
    用于缓存周期性聚合数据的结果表

Federated

特点:
    提供了访问远程mysql服务器上表的方法
    本地不存储数据,数据全部放到远程服务器上
    本地需要保存表结构和远程服务器的连接信息
    
如何使用:
    默认禁止,启用需要在启动时增加federated参数
    
    mysql://user_name[:password]@host_name:[port]/db_name/table_name
    
适用场景:
    偶尔的统计分析及手工查询

选择存储引擎:

参考条件:事务、备份、崩溃恢复、存储引擎的特有特性

不建议混合使用存储引擎。
  • 数据库参数配置:

mysql配置参数作用域

全局参数:
    set global 参数名=参数值;
    set @@global.参数名:=参数值;

会话参数:
    set [session] 参数名=参数值;
    set @@session.参数名:=参数值;

内存配置参数

确定可以使用的内存上限

确定mysql的每个连接使用的内存
    sort_buffer_size(排序缓冲区大小)
    join_buffer_size(连接缓冲区大小)
    read_buffer_size(读缓冲区大小)
    read_rnd_buffer_size(索引缓冲区大小)
    
确定需要为操作系统保留多少内存

如何为缓存池配置内存
    Innodb_buffer_pool_size(建议大小:总内存 - (每个线程需要的内存 * 连接数) - 系统保留内存)
    key_buffer_size(select sum(index_length) from information_schema.tables where engine='myisam')

I/O配置参数

Innodb I/O配置:
    Innodb_log_file_size(单个事务日志大小)
    Innodb_log_files_in_group(事务日志文件个数),事务日志总大小 = Innodb_log_files_in_group * Innodb_log_file_size
    Innodb_log_buffer_size(事务日志缓冲区大小)
    Innodb_flush_log_at_trx_commit(0,每秒进行一次log写入cache,并flush log到磁盘;1,默认,在每次事务提交执行log写入cache,并flush log到磁盘;2,建议,每次事务提交,执行log数据写入到cache,每秒执行一次flush log到磁盘)
    Innodb_flush_method=O_DIRECT(指定Innodb不要缓存数据,也不要预读数据)
    Innodb_file_per_table=1(指定Innodb为每个表建立一个独立的表空间)
    Innodb_doublewrite=1(指定Innodb启用双写缓存)
    
MyISAM I/O配置:
    delay_key_write(OFF,每次写操作后刷新键缓冲中的脏块到磁盘;ON,只对在建表时指定了 delay_key_write 选项的表使用延迟刷新;ALL,对所有MyISAM表都使用延迟键写入)

安全配置参数

expire_logs_days(指定自动清理binlog的天数)
max_allowed_packet(控制mysql可以接收的包的大小)
skip_name_resolve(禁用DNS查找)
sysdate_is_now(确保sysdate()返回确定性日期)
read_only(禁止非超级权限的用户有写权限)
skip_slave_start(禁用slave自动恢复)
sql_mode(设置mysql所使用的sql模式。常用选项:strict_trans_tables、no_engine_subtitution、no_zero_date、no_zero_in_date、only_full_group_by)

其它配置参数

sync_binlog(控制mysql如何向磁盘刷新binlog,默认为0,表示mysql不会主动刷新,建议设置为1)
tmp_table_size 和 max_heap_table_size(控制内存临时表大小)
max_connections(控制允许的最大连接数)
  • 数据库结构设计和SQL语句:

数据库设计对性能的影响:

过分的反范式化为表建立太多的例
过分的范式化造成太多的表关联
在OLTP环境中使用不恰当的分区表
使用外键保证数据的完整性
  • 总结:

性能优化顺序:

数据库结构设计和SQL语句
    ↓
数据库存储引擎的选择和参数设置
    ↓
系统选择及优化
    ↓
硬件升级

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!