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語句優化
  • 數據庫的存儲引擎的選擇和參數的配置
  • 系統的選擇及其優化
  • 硬件升級
相關文章
相關標籤/搜索