MySQL数据库的性能的影响分析及其优化

MySQL数据库的性能的影响

一. 服务器的硬件的限制

二. 服务器所使用的操做系统

三. 服务器的所配置的参数设置不一样

四. 数据库存储引擎的选择

五. 数据库的参数配置的不一样

六. (重点)数据库的结构的设计和SQL语句


1). 服务器的配置和设置(cpu和可用的内存的大小)

1.网络和I/O资源 
 2.cpu的主频和核心的数量的选择
 (对于密集型的应用应该优先考虑主频高的cpu)
 (对于并发量大的应用优先考虑的多核的cpu)
 3.磁盘的配置和选择
 (使用传统的机械硬盘:
	特色:读写较慢、存储空间大、最多见、使用最多、价格低;
	工做过程:移动磁头到磁盘表面上的正确位置;
			 等待磁盘的旋转,使得所得所需的数据在磁头之下;
			 等待磁盘旋转过去,全部所需的数据都被磁头读出
	选择因素:存储容量、传输速度、访问时间、主轴转速、物理尺寸)
 (使用RAID加强传统的机器硬盘的性能:
	特色:利用小的磁盘组成大的磁盘并提供数据的冗余保证数据的完整性的技术
	数据库中所使用的RAID的级别:
		RAID0级别、RAID1级别、RAID5级别[分布式奇偶校验磁盘阵列]、RAID10[分片的镜像(数据库最好的方式)]
	RAID级别选择:以下图)
 (使用固态存储的SSD和PCI-E卡:
	特色:相对于机械盘固态磁盘有更好的随机读写性能;
		 相对于机械固态磁盘能更好的支持并发;
		 相对于机械固态磁盘更容易损坏
	SSD:使用SATA接口能够替换传统的磁盘而不须要任何的改变[受到接口的速度的限制];
		SATA接口的SSD一样支持RAID技术
	PCI-E卡(Fusion-IO卡):没法使用在SATA接口[须要使用独特的驱动和配置];
						 价格贵,使用了cpu的资源和内存
	使用的场景:适用于存在大量的随机I/O的场景;
			  适用于解决单线程负载的I/O瓶颈)
 (使用网络存储NAS和SAN:
	SAN[光纤接入服务器]:大量顺序读写操做、读写I/O、缓存、I/O合并、随机读写慢(不如本地的RAID)
	NAS设备使用网络链接,基于文件的协议如NFS或者SMB来访问
	适合场景:数据库的备份、)
复制代码

使用RAID加强传统的机器硬盘的性能->RAID0级别
使用RAID加强传统的机器硬盘的性能->RAID1级别
使用RAID加强传统的机器硬盘的性能->RAID5级别

不一样REAID级别的对比:

注意事项:mysql

1.64位数据库的版本使用32位的服务器的版本
 2.内存的主频的选择主板所能支持的最大内存的频率
复制代码
总结:
对于cpu:
		1.64位的cpu必定可以要工做在64位的系统下
		2.对于并发比较高的场景cpu的数量比频率重要
		3.对于cpu密集型的场景和复杂SQL则频率越高越好
	对于内存:
		1.选择主板所能使用的最高频率的内存
		2.内存的大小对性能很重要,因此尽量的大
	I/O子系统:
		1.PCIe -> SSD -> RAID10 -> 磁盘 -> SAN
复制代码

2). 操做系统对性能的影响

Windows、FreeBSD、Solaris、Linux
centos的参数优化的设置:
	(1)内核相关的参数(/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

		net.core.wmem_defaullt = 87380
		net.core.wmem_max = 16777216
		net.core.rmem_defaullt = 87380
		net.core.rmem_max = 16777216

		net.ipv4.tcp_keepalive_time = 120
		net.ipv4.tcp_keepalive_intvl = 30
		net.ipv4.tcp_keepalive_probes = 3
		
		kernel.shmmax = 4294967295
		vm.swappiness = 0
	(2)增长资源限制(/etc/security/limit.conf)
		* soft nofile 65535
		* hard nofile 65535
			* 表示对全部的用户有效
			soft 指的是当前系统的生效的设置
			hard 代表系统中所能设定的最大值
			nofile 表示所限制的资源是打开文件的最大数目
			65535 就是限制的数量
	(3).磁盘调度策略(/sys/block/devname/queue/scheduler)
		noop(电梯式调度策略)、deadline(截止时间调度策略)、anticipatory(预料I/O调度策略)
		cat /sys/block/sda/queue/scheduler
		noop anticipatory deadline [cfq]
			
			echo deadline > /sys/block/sda/queue/scheduler
复制代码

3).MySQl的数据库的体系

MySQl的数据库的体系

4).MySQl的数据库的存储引擎

(1).Mysql之存储引擎MyISAM
	组成的结构:表为MYD和MYI、frm的文件组成
	特性:并发性和锁级别
		 MyISAM表支持索引类型
		 MyISAM表支持数据的压缩(命令行:myisampack)
		 	myisampack -b -f myIsam.MYI;
			压缩后的表不能进行写操做,只能进行读操做
	修复:对数据库中的表进行检查并修复:
		check table mytable;
		repair table mytable;

		myisamchk工具,修复时数据库服务必须中止
	限制:使用MySQL5.0以前时默认表的大小4G(存储大表修改MAX_Rows和AVG_ROW_LENGTH)
		 使用MySQL5.0以后的版本默认支持256TB
	适用的场景:非事务型的应用
			  只读类的应用
			  空间类的应用(GPS的数据)
(2).Mysql之存储引擎InnoDB
	mysql5.5.8以后版本默认使用的存储引擎
	组成结构:经过设置innodb_file_per_table参数存储的位置不一样
				ON:独立表空间:tablename.ibd
				OFF:系统表空间:ibdataX
	建议:对于mysql中建议使用InnoDB的独立表空间
	特性:事务性存储引擎
		 彻底支持事务的存储引擎
		 Redo log(存储已经提交的事务)和Undo log(存储未提交的事务)

		 InnoDB支持行级别锁
		 最大程序的支持并发
		 行级别的锁是由存储引擎层实现的
	锁:共享锁(读锁)、独占锁(写锁)
	 	表级锁、行级锁
		阻塞:确保事务并发的正常的执行
		死锁:两个或者两个以上的事务执行过程当中相互等待对方的资源而产生的一种异常
	InnoDB状态检查:
		show engine innodb status;	
	适用场景:InooDB适用于大多数OLTP应用
(3).Mysql之存储引擎CSV
	特色:数据以文本的方式存储在文件中
		.CSV文件存储表的内容
		.CSM文件存储表的元数据如表的状态和数据量
		.frm文件存储表的结构的信息
		以CSV格式进行数据的存储
		全部的列必须不能为NULL的
		不支持索引(不适合大表,不适合在线处理)
		能够对数据文件直接进行编辑
	适用的场景:适合做为数据交换的中间表
			  mysql数据目录->csv文件->其余web程序
			  excel电子表格 -> csv文件 -> mysql数据目录
(4).Mysql之存储引擎Archive
	特色:以zlib对表数据进行压缩,磁盘I/O更少
		 数据存储在ARZ为后缀的文件中

		 只支持insert和select操做
		 只支持在自增的ID列上加索引
	适用场景:
		 日志和数据采集类的应用
(4).Mysql之存储引擎Memory
	特色:数据只保存在内存中
		 Memory存储引擎的I/O效率特别高
		 支持HASH索引和BTree索引
		 全部的字段为固定长度
		 不支持BLOG和TEXT等大字段
		
		 Memory存储引擎使用表级锁
		 表中存储数据的最大值由max_heap_table_size参数决定
	适用场景:用于查找或者映射表,例如邮编和地区
			 用于保存数据分析产生的中间表
			 用于缓存周期性聚合数据的结果表
复制代码

5).MySQl的数据库的服务器参数

(1).Mysql配置参数做用域
	全局参数 
		set global 参数名=参数值;
		set @@global.参数名:=参数值;
	会话参数
		set[session] 参数名=参数值;
		set @@session.参数名:=参数值;
(2).内存配置相关的参数
		肯定能够使用的内存的上限
		肯定MySQL的每一个链接使用的内存
			sort_buffer_size join_buffer_size
			read_buffer_size read_rnd_buffer_size
		肯定须要为操做系统保留多少内存
		如何为缓存池分配内存
			Innodb_buffer_pool_size
			总内存-(每一个线程锁须要的内存*链接数)- 系统的保留内存
			key_buffer_size
(3).I/O相关配置参数
		InnoDb存储引擎的I/O参数设置:
		Innodb_log_file_size
		Innodb_log_file_in_group
		Innodb_log_buffer_size
		Innodb_flush_log_at_trx_commit
		
		Innodb_flush_method = O_DIRECT
		Innodb_file_per_table = 1
		Innodb_doublewrite = 1
	  MySIAM存储引擎的I/O参数设置:
		delay_key_write
			OFF:每次操做后刷新键缓冲中的脏块到磁盘
			ON:只对在键表时指定了delay_key_write选项的表使用延迟刷新
			ALL:对全部MYSIAM表都使用延迟键写入
(4).安全相关配置参数
		expire_logs_days 指定自动清理binlog的天数
		max_allowed_packet 控制MySQL能够接受的包的大小(32M)
		skip_name_resolve 禁用DNS查找

		sysdate_is_now 确保sysdate()返回肯定性的日期
		read_only 禁止非super权限的用户写权限
		skip_slave_start 禁止Slave自动恢复
		sql_mode 设置MySQL所使用的SQL模式
			strict_trans_tables
			no_engine_subtitutoion
			no_zero_date
			no_zero_in_date
			only_full_group_by
(5).其余相关配置参数
		sync_binlog = 1控制MySQL如何向磁盘刷新binlog
		tmp_table_size和max_heap_table_size 控制内存临时表的大小(设置一致)
		max_connections = 2000 控制容许的最大链接数
复制代码

6).MySQl的数据库的结构设计和SQL的优化

(1).过度的反范式化为表的创建太多的列
(2).过度的范式化形成太多的表关联
(3).在OLTP环境中使用不恰当的分区表
(4).使用外键保证数据的完整性
复制代码

性能优化的顺序

  • 数据库结构设计和SQL语句优化
  • 数据库的存储引擎的选择和参数的配置
  • 系统的选择及其优化
  • 硬件升级
相关文章
相关标签/搜索