介绍服务器硬件、服务器系统、数据库存储引擎、数据库参数配置、数据库结构设计和mysql语句对数据库的影响
一 影响性能的几个方面
服务器硬件
服务器系统
数据库存储引擎(插件式存储引擎)
MyISAM:不支持事务,表级锁
InnoDB:事务级存储引擎,完美支持行级锁,事务的ACID
数据库参数配置
数据库结构设计和sql语句
二 服务器硬件
1 cpu资源和可用内存大小
mysql不支持多cpu对同一sql并发处理
2 磁盘的配置和选择
使用传统机器磁盘
特点:
存储空间大,读写慢、价格低、使用最多
传统机器硬盘读取数据的过程
移动磁头到磁盘表面的正确位置
等待磁盘旋转过去,所有所需的数据都被磁头读出
使用raid增强传统机械硬盘的性能
什么是raid:raid是一种把多块的硬盘按不同的方式组合起来形成的一个硬盘组,从而提供比单个硬盘更高的存储性能和提供数据备份技术。
使用固态存储SSD和PCIe卡
特点相对于机械磁盘
相比机械磁盘,固态磁盘更容易损坏(每次写操作,都要对写入单元进行擦除操作)
更好的随机读写性能
更好的支持并发
SSD
特点
使用SATA接口:可以替换传统磁盘而不需要任何改变
SATA接口的SSD同样支持RAID技术
PCI-E SSD
特点:
无法使用SATA接口:需要独特的驱动和配置
价格相对与SSD要贵,但性能比SSD更好
固态存储的使用场景
使用于存在大量随机I/O的场景
使用于解决单线程负载的I/O瓶颈
使用网络NAS和SAN
定义: 两种外部文件存储设备加载到服务器的方式
区别:SAN设备通过光纤连接到服务器,设备通过快接口访问,服务器可以将其当作磁盘使用
网络存储使用的场景
数据库备份
网络对性能的影响
磁盘性能的限制
延迟、吞吐量
网络性能的限制
延迟、带宽
网络带宽对性能的影响
网络质量对服务器性能的影响(丢包、网络风暴)
建议:
采用高性能和高带宽的网络接口设备和交换机
对多个网卡进行绑定,增强可用性和带宽
对可能进行的网络隔离
服务器系统
操作系统对性能的影响
window大小写不敏感,linux敏感
FreeBSD
Solaris
linux
CentOs系统参数优化
内核相关参数(/etc/sysctl.conf)
增加资源限制(/tec/security/linit.conf)
磁盘调度策略(/sys/block/devname/queue/scheduler)
文件系统对性能的影响
windows fat ntfs
linux ext3,ext4,xfs
数据库存储引擎
mysql体系结构
插件式存储引擎
mysql服务层,select如何从文件中获取我们所要查询的数据,这个具体的实现则是由下一层存储引擎实现的
存储引擎是针对于表的而不是针对于库的(一个库中的不同表可以使用不同的存储引擎)
mysql常用存储引擎之MyISAM
myISAM存储引擎表有MYD和MYI组成
Mysql5.5之前版本默认存储引擎(系统表,临时表;在排序、分组等操作中,当数量超过一定大小后,由查询优化器建立的临时表)
特性:
并发性与锁级别:表级锁
表损坏修复
check table;
repair table myisam
myisam表支持的索引类型
myisam表支持数据压缩(myisampack)
限制
版本<5.0 默认大小是4G
如存储大表则需要修改MAX_ROWS和AVG_ROW_LENGTH
版本>mysql5.0默认支持为256TB
使用场景
非事务型应用
只读类应用(压缩功能)
空间类应用(gps函数运算)
mysql常用存储引擎之Innodb
Mysql5.5 及以后版本默认存储引擎
innodb使用表空间进行数据存储
innodb_file_per_table on 独立表空间
off 系统表空间
系统表空间和独立表空间要如何选择
系统表空间无法简单的收缩文件大小
独立表空间可以通过optimize table收缩系统文件
系统表空间会产生io瓶颈
独立表空间可以同时向多个文件刷新数据
建议:
对innodb使用独立表空间
表转移的步骤(系统-》独立)
使用mysqldump到处所有数据库表数据
停止mysql服务,修改参数,并删除innodb相关文件
重启mysql服务,重建innodb系统表空间
重新导入数据
innodb存储引擎的特性
innodb是一种事务性存储引擎
完全支持事务的ACID特性
Redo log(已提交事务的log)和Undo log(未提交事务的log)
innodb支持行级锁
行级锁可以最大程度的支持并发
行级锁是有存储引擎层实现的
innodb状态检查:show engine innodb status
什么是锁
锁的主要作用是管理共享资源的并发访问
锁用于实现事务的隔离性
锁的类型
共享锁(读锁)
独占锁(写锁)
锁的粒度
表级锁
如何选择存储引擎
参考条件
事务、备份、崩溃恢复、存储引擎的所有特性、不要混合使用存储引擎
数据库参数配置
命令行参数
mysql_safe -datadir=/data/sql_data
配置文件
/etc/my.cnf
/etc/mysql/my.cnf
/home/mysql/my.cnf
~/.my.cnf
mysql配置参数的作用域
全局参数
set global 参数名=参数值
set @@global 参数名=参数值
会话参数
set[session]参数名=参数值
内存配置相关参数
确定可以使用的内存上限
确定mysql的每个连接使用的内存
下面的配置都是针对线程
sort_buffer_size 排序缓存区的大小
join_buffer_size 连接缓存区的大小
read_buffer_size 全表查询读的缓冲区大小
read_rnd_buffer_size 索引
需要为系统保留多少内存
如何为缓存池分配内存
innodb_buffer_poor_size
总内存-(线程连接所需的内存*连接数)-系统保留内存
key_buffer_size:针对MySAM
IO相关配置参数
innodb i/o相关配置
先写事务日志,后刷新数据到io
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
安全相关配置参数
expire_logs_days 指定自动清理binlog的天数
max_allowed_packet:控制mysql可以接受的包的大小
skip_name_resolve 禁用dns查找
sysdate_is_now 确保sysdate()返回确定性日期
read_only禁止非super权限的用户写权限
skip_slave_start 禁用slave自动复制
sql_mode设置mysql所使用的sql模式
其他常用参数配置
sync_binlog控制mysql如何向磁盘刷新binglog
tmp_table_size
max_heap_table_size 控制内存临时表
max_conections 控制允许的最大连接数
数据库结构设计和sql语句
数据库设计对性能影响
过分的反范式化为表建立太多的列
过分的范式化造成了太多的表关联
oLTP环境中使用了不恰当的分区表
使用外键保证数据的完整性
总结
性能优化顺序
数据库结构和sql语句,数据库存储引擎的选择和参数配置,系统选择及优化,硬件升级