詳解MySQL性能優化方案

MySQL性能優化方案

1、影響MySQL性能的因素

1.1硬件

硬件就是服務器配置,cpu,內存,硬盤等

1.2系統配置

系統配置值操作系統的配置。Linux服務器的一切東西都是基於文件的,mysql的數據都是以文件形式存在在磁盤上的

1.2.1最大打開文件數量

Linux系統有一個文件打開數量的系統配置,默認是1024。對於併發大數據表多的情況下是不夠用的,我們可以修改這個系統配置參數。路徑爲/etc/security/limits.conf。

limits.conf文件相關說明:

type:soft/hard/-
soft指當前系統生效的設置值。
hard指系統所能設定的最大值。
soft不能比hard高。-表示同時設置soft和hard的值

item:
core       -限制內核文件的大小
date       -最大數據大小
fsize      -最大文件大小
memlock    -最大鎖定內存地址空間
nofile     -打開文件的最大數目
rss        -最大持久設置大小
stack      -最大棧大小
cpu        -以分鐘爲單位的最多cpu時間
noproc     -最大進程數目
as         -地址空間限制
maxlogins  -此用戶允許登錄的最大數目

1.2.2 sleep超時時間

MySQL默認8小時不操作數據庫自動關閉。當有程序缺陷時就會一直佔用數據庫連接數,併發大的時候會導致連接不上數據庫。

通過下面命令重新設置sleep的時間

set global wait_timeout=600; #設置sleep的超時時間,單位秒

show variables like '%wait_timeout%'; #查詢超時時間

1.2.3獨立表空間設置

表空間:數據表存放數據的地方

小栗子:

一個倉庫,你要往倉庫裏面放東西的話,來一些東西你就隨便扔到裏面,這樣東西一多,你要找到一個東西 就很難找了。
那怎麼辦呢,我在倉庫裏面放幾個貨架,每個貨架放同一個種類的東西,這樣的話,找一個東西 就很方便了。
表空間就和這個貨架差不多,每個表單獨管理的話,那找數據就比較方便了。
 
mysql5.6.6之前默認是共享表空間,mysql5.6.6之後默認是獨立表空間
 

共享表空間:就是說這個空間是所有的表都共享的,所有的表的數據都存在一個地方的。

想一想所有的貨架都存在一個倉庫裏面的話,快遞員去拿貨的時候,人一多,可能進出都要排隊,拿貨的時候就比較慢了。
 
所以說共享表空間在數據量和併發量大的情況下,對IO消耗很大,影響性能
 
共享表空間的缺點:不能自動收縮
 
什麼是自動收縮?
 
剛建表的時候,表裏面數據很少,就1條數據,可能佔用空間就幾kb,到後來數據多了,佔用了10G的空間,然後發現有一些數據都是垃圾數據,刪了5G,那這個時候表空間就不會自動減小了,它還是10G,浪費空間。
 
設置獨立表空間打開
set global innodb_file_per_table=NO; #設置獨立表空間打開

show variables like '%per_table%'; #查看是否獨立表空間

1.2.4 讀/寫進程數配置

mysql5.5以後讀寫進程可以配置,默認讀和寫的進程數是4個。
 
修改mysql配置文件,在[mysqlld]節點下加入以下參數
innodb_read_io_threads=5 #讀進程數

innodb_write_io_threads=3 #寫進程數

1.2.5緩存配置

計算機在處理任務時的流程是怎樣的?

讀:先在磁盤讀取數據,然後放到內存中,cpu去內存中拿數據,再處理。

寫:cpu處理完,寫內存,再把從內存放到磁盤中。

mysql執行查詢語句流程是怎樣的?

查詢緩存會跟蹤系統中的每張表,如果這些表發生變化,那麼和這張表相關的所有查詢緩存全部失效,當查詢命中緩存時,mysql會跳過解析、優化和執行階段,直接返回結果。

開啓緩存對於讀寫也增加了額外的開銷,對於讀,在查詢開始前需先檢查緩存;對於寫,在寫入數據後需更新緩存,一般情況下這些開銷相對較小,在實際應用時可根據業務特徵權衡是否開啓查詢緩存。

開啓查詢緩存,在mysql配置文件[mysqlld]加入下列參數

query_cache_size=200M #分配給查詢緩存的總內存,一般不建議超過256M

query_cache_limit=1M #單個查詢緩存的最大內存,查詢結果比這個大,就不會緩存。

show variables like '%query_cache%'; #查詢緩存的狀態

innodb_buffer_pool

buffer pool是innodb存儲引擎帶的緩存池,查詢數據時,會先在內存中查詢,內存中存在就直接返回,節省查詢響應時間

innodb_buffer_pool和qcache的區別是:buffer_pool緩存的是表中的數據,qcache緩存的是sql語句對應的結果集。

innodb_buffer_pool參數設置

innodb_buffer_pool_size=50M #緩存池的大小

innodb_buffer_pool_dump_now=on #停止mysql服務時,innodb講緩存池中的熱數據保存到本地磁盤

innodb_buffer_pool_load_at_startup=on #啓動mysql服務時,mysql將本地熱數據加載到緩存池中


show variables like '%innodb_buffer_pool%'; 查看buffer_pool的大小

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章