https://dev.mysql.com/doc/
如果英文不好的话,可以参考 searchdoc 翻译的中文版本
http://www.searchdoc.cn/rdbms/mysql/dev.mysql.com/doc/refman/5.7/en/index.com.coder114.cn.html
硬件资源(CPU 、内存、磁盘等)
操作系统的区别
MySQL的存储引擎的选择
MyISAM: 不支持事务,表级锁
InnoDB: 事务级存储引擎,完美支持行级锁,事务ACID特性。
但 比不是说 MyISAM比InnoDB差,看使用场景
数据库参数设置
数据库结构设计和SQL语句 ,毫无疑问 这个是最最重要的因素 —> mysql 可以开启慢查询监控耗时长的SQL
更多的CPU or 更快的CPU ?
主要从以下几个方面考虑:
分析下我们的应用的类型,是的话,要提高SQL的运行效率,那就需要更快的CPU。
还有一点需要注意 MySQL不支持多CPU对同一SQL的并发处理,也就是说一个SQL只能运行在一个CPU的核上。
一个SQL只能跑在一个CPU上,如果有32个CPU呢 ,是不是同时可以跑32个SQL呢? 就是我们前面说的QPS 。 一般web应用,CPU的核心数量比CPU的主频更重要。
5.6、 5.7以上的版本,对多核CPU的支持更好。
32的操作系统,进程所能寻址的最大内存也就4G。
总结
MyISAM : 索引 缓存在内存 ,数据通过OS来缓存
InnoDB : 索引和数据都是通过内存来缓存
举个例子, 100G的数据量, 内存64G,这个时候增加内存对性能有提高。 如果内存是256G,还是慢,那就是其他问题了。
当然了,内存多了,对于数据的读和写都是好处的,都可以利用缓存来提高读写性能。
如何选择内存呢? ----> 建议选择主板支持的最大内存频率, 跟CPU一个道理。
内存的型号,保持一致, 单个内存尽可能的大,都是比较好的选择。
配置的时候,要考虑数据的增长,比如100G的数据, 128G内存可能已经满足了要求,但数据可能增长较快,这个时候256的更佳。
总结
主流的4种
传统的机械硬盘的读取数据的过程
考虑的话 1. 存储容量 2.传输速度 3 访问时间 4 主轴的转速(常见的7200转、1万5千转等等) 5. 物理尺寸
RAID : 磁盘冗余队列 (Redundant Arrays of Independent Disks )
RAID是一种将多个容量较小的磁盘组成一组容量更大的磁盘,并提供数据冗余来保证数据完整性的技术 。
Linux-Raid0、Raid1、Raid5、Raid10初探
SSD
特点:
举个例子 SATA3.0接口 6Gbps , 放到SATA2.0接口上 最多只能用到2.0的 3Gbps
PCIe 卡(Fushion IO)
固态存储使用的场景
举个例子
主从节点的MYSQL, 有一个SSD, 给哪个节点用呢 ?
----> 从节点 上用。 主节点上写 ,是多线程, 从节点的复制,单线程,为了减少延迟,建议放到从服务器上。
SAN: Storage Area Network
NAS: Network Attached Storage
是两种外部文件存储设备加载到服务器上的方法。
SAN设备通过光纤连接服务器,设备通过块接口访问,服务器可以将其当做硬盘使用。 可以承受大量的顺序读写,但随即读有的时候不如RAID
NAS 使用 宽带来传输,有延迟。
使用场景的话: 数据备份等 。
总结
网络带宽 —> 低延时 、吞吐量达
网络质量—> 少抖动
建议
windows 和 linux , 大小写的区别,可以通过修改MySQL的配置来调整。
以CentoOS为例来了解下系统的参数优化
/etc/sysctl.conf
net.core.somaxconn=65535 # Linux kernel参数,表示socket监听的backlog(监听队列)上限
net.core.netdev_max_bakclog=65535 # 允许发送到队列中的数据包数目
net.ipv4.tcp_max_syn_backlog=65535 # #表示SYN队列长度,默认1024,改成65535,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_fin_timeout = 10 #表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间
net.ipv4.tcp_tw_reuse = 1 #表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 #表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
TCP/IP及内核参数优化调优
net.core.wmen_default = 87380 # 表示内核套接字发送缓存区默认的大小。
net.core.wmen_max = 16777216 # 表示内核套接字发送缓存区最大大小。
net.core.rmem_default = 87380 # 默认的TCP数据接收缓冲
net.core.rmem_max=16777216 # 最大的TCP数据接收缓冲
#单位是秒 可适当调整
net.ipv4.tcp_keepalive_time = 120 # 有效时长
net.ipv4.tcp_keepalive_intvl = 30 # 探测失败时,重发的间隔
net.ipv4.tcp_keepalive_probes = 3 # 最多发送多少次探测消息
kernel.shmmax = 4294967295 # (4G)单个共享内存段的最大值,应该设置的足够大,以便能在一个共享段下容纳整个Innodb缓冲池的大小 。 可以取物理内存-1 byte
vm.swappiness = 0 # 除非虚拟内存满了,否则不会使用交换分区
其实就是swap交换分区的设置, 当操作系统没有足够的内存时,就会将一些虚拟内存写到磁盘的交换区中,这样就会发生内存交换。
然后执行sysctl -p命令,使上述修改生效
# 文件句柄数量
* soft nofile 65535
* hard nofile 65535
* 对所有用户生效
soft 当前系统生效的设置
hard 系统所能设置的最大值
nofile 表示所限制的资源是打开文件的最大数目
65535 限制的数目
这俩参数,重启系统才生效。
I/O 调度算法再各个进程竞争磁盘I/O的时候担当了裁判的角色,以求得尽可能最好的整体I/O性能。
在linux下面列出4种调度算法
#查看当前IO
[root@artisan ~]# cat /sys/block/sd*/queue/scheduler
noop [deadline] cfq
[root@artisan ~]#
windows -----> FAT 和 NTFS
WinServer 只有 NTFS 这种可以选择
Linux —> EXT3 EXT4 XFS
EXT3 EXT4系统的挂载参数 /etc/fstab
# data的可配置选项
data=writeback | ordered |journal
noatime
nodiratime
/dev/sda1/ext4 noatime,nodiratime,data-writeback 1 1