MySQL資料庫的性能的影響分析及其優化 MySQL資料庫的性能的影響 一. 伺服器的硬體的限制 二. 伺服器所使用的操作系統 三. 伺服器的所配置的參數設置不同 四. 資料庫存儲引擎的選擇 五. 資料庫的參數配置的不同 六. (重點)資料庫的結構的設計和SQL語句 1). 伺服器的配置和設置(cp ...
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級別的對比:
註意事項:
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 控制允許的最大連接數
5).MySQl的資料庫的結構設計和SQL的優化
(1).過分的反範式化為表的建立太多的列
(2).過分的範式化造成太多的表關聯
(3).在OLTP環境中使用不恰當的分區表
(4).使用外鍵保證數據的完整性
性能優化的順序
- 資料庫結構設計和SQL語句優化
- 資料庫的存儲引擎的選擇和參數的配置
- 系統的選擇及其優化
- 硬體升級