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獨立表空間設置
表空間:數據表存放數據的地方
小栗子:
一個倉庫,你要往倉庫裏面放東西的話,來一些東西你就隨便扔到裏面,這樣東西一多,你要找到一個東西 就很難找了。
那怎麼辦呢,我在倉庫裏面放幾個貨架,每個貨架放同一個種類的東西,這樣的話,找一個東西 就很方便了。
共享表空間:就是說這個空間是所有的表都共享的,所有的表的數據都存在一個地方的。
set global innodb_file_per_table=NO; #設置獨立表空間打開
show variables like '%per_table%'; #查看是否獨立表空間
1.2.4 讀/寫進程數配置
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的大小