Mysql的并發(fā)參數(shù)調(diào)整詳解
查詢緩存優(yōu)化
不建議使用,一般是在應(yīng)用服務(wù)做緩存層,畢竟數(shù)據(jù)并發(fā)能力是有限的
概述
當(dāng)開始Mysql的查詢緩存,執(zhí)行相同的sql語句的時候,服務(wù)器就會直接從緩存中讀取結(jié)果,當(dāng)數(shù)據(jù)被修改,之前的緩存會失效,修改比較頻繁的表不適合做查詢緩存
查詢流程
1、客戶端發(fā)送一條查詢給服務(wù)器 2、服務(wù)器先會檢查查詢緩存,如果命中了緩存,則立即返回存儲在緩存中的結(jié)果,否則進入下一階段 3、服務(wù)器端進行sql解析、預(yù)處理、再由優(yōu)化器生成對應(yīng)的執(zhí)行計劃 4、根據(jù)生成的執(zhí)行計劃,調(diào)用存儲引擎的Api來執(zhí)行查詢 5、將結(jié)果返回給客戶端--并將查詢到的結(jié)果放到查詢緩存中
查詢緩存配置
查詢數(shù)據(jù)庫是否支持查詢緩存(YES or ON) show variables like 'have_query_cache'; 查看數(shù)據(jù)庫是否開啟了查詢緩存 show variables like 'query_cache_type'; OFF 或 0 查詢緩存功能關(guān)閉 ON 或 1查詢緩存功能打開,select的結(jié)果符合緩存條件即會緩存,否則不予緩存,顯示指定SQL_NO_CACHE,不予緩存 DEMAND 或 2 查詢緩存功能按需進行,顯示指定SQL_CACHE的SELECT語句才會緩存;其他不予緩存 查看查詢緩存的大小 show variables like 'query_cache_size'; 查看緩存的狀態(tài) show status like 'Qcache%'; Qcache_free_blocks 緩存中可用的內(nèi)存塊數(shù)量 Qcache_free_memory 緩存中可用的內(nèi)存量 Qcache_hits 查詢緩存命中數(shù) Qcache_lowmen_prunes 由于內(nèi)存不足而從查詢緩存中刪除的查詢數(shù) Qcache_not_cached 非緩存查詢的數(shù)量(query_cache_type設(shè)置而無法緩存) Qcache_queries_in_cache 查詢緩存中注冊的查詢數(shù) Qcache_total_blocks 查詢緩存中的塊總數(shù) 開啟查詢緩存 找到mysql的配置文件添加 my.cnf 添加query_cache_type=1 開啟查詢緩存結(jié)果是 query_cache_type=DEMAND select SQL_CACHE id from table 開啟查詢緩存結(jié)果是 query_cache_type=ON select SQL_NO_CACHE id from table
查詢緩存失效的情況
sql語句不一致情況 查詢sql中有不確定信息: 如 now(),current_date(),curdate(),curtime(),rand(),uuid(),database() 不使用任何表查詢語句 查詢 mysql ,infomation_schema或 performance_schema數(shù)據(jù)庫中的表時,不會走查詢緩存 在存儲函數(shù),觸發(fā)器或事件的主體內(nèi)執(zhí)行的查詢 表修改會刪除查詢緩存,如 insert,update,delete,drop...
內(nèi)存管理優(yōu)化
內(nèi)存優(yōu)化原則
將盡量多的內(nèi)存分配給Mysql做緩存,要給操作系統(tǒng)和其他程序預(yù)留足夠內(nèi)存 MyISAM存儲引擎的數(shù)據(jù)文件讀取依賴于操作系統(tǒng)自身的IO緩存,因此,如果有MyISAM表,就要預(yù)留更多的內(nèi)存給操作系統(tǒng)做IO緩存 排序區(qū),連接區(qū)等緩存是分配給每個數(shù)據(jù)庫會話(session)專用的,其默認的設(shè)置要根據(jù)最大的連接數(shù)合理分配,如果設(shè)置太大,不但浪費資源,而且在并發(fā)連接較高時會導(dǎo)致無力內(nèi)存耗盡
MyISAM內(nèi)存優(yōu)化
myisam存儲引擎使用key_buffer緩存索引塊,加速myisam索引的讀寫速度。對于myisam表的數(shù)據(jù)塊,mysql沒有特別的緩存機制,完全依賴于操作系統(tǒng)的io緩存 key_buffer_size=512M key_buffer_size的值越大效率越高,建議至少將1/4可用內(nèi)存分配給key_buffer_size show variables like 'key_buffer_size'; 查詢key_buffer_size的大小 red_buffer_size 如果經(jīng)常順序掃描myisam表,可以通過增大read_buffer_size的大小值來改善性能,但不能調(diào)的過大,因為key_buffer_size是每個session獨占的,如果設(shè)置多個會造成資源浪費 red_rnd_buffer_size 經(jīng)常需要排序的myisam表的查詢,如果帶有order by 子句的sql 適當(dāng)增加red_rnd_buffer_size的值可以改善此類sql性能---也是session獨享的,也不能設(shè)置過大
InnoDB內(nèi)存優(yōu)化
InnoDB用一塊內(nèi)存區(qū)做io緩存池,該緩存池不僅用來緩存innoDB的索引塊,而且也用來緩存innoDB的數(shù)據(jù)塊 inodb_buffer_pool_size 該變量決定了innoDB存儲引擎和索引數(shù)據(jù)的最大緩存區(qū)大小,在保證操作系統(tǒng)及其他程序有足夠內(nèi)存可用的情況下,值越大緩存命中率越高,訪問innoDb表需要的磁盤io就越少,性能也就越高 innodb_buffer_pool_size=521M innodb_log_buffer_size 決定了innodb重做日志緩存的大小,對于可能產(chǎn)生大量更新記錄的大事務(wù),增加innodb_log_buffer_size大小,可以避免innodb在事務(wù)提交前執(zhí)行不必要的日志寫入磁盤io innodb_log_buffer_size=10M show variables like 'innodb_buffer_pool_size'; innodb_flush_log_at_trx_commit 控制innodb將log buffer中的數(shù)據(jù)寫入日志文件并flush磁盤的時間點,值分別為,0,1,2 innodb_thread_concurrency 設(shè)置innodb線程的并發(fā)數(shù),默認為0表示不受限制,如果要設(shè)置建議跟服務(wù)器的CPU核心數(shù)一致或者CPU核心數(shù)的兩倍 innodb_log_buffer_size 執(zhí)行日志文件所用的內(nèi)存大小,以M為單位 innodb_log_files_in_group 以循環(huán)的方式將日志文件寫到多個文件中 read_buffer_size mysql讀入緩沖區(qū)大小,對表進行順序掃描的請求將分配到一個讀入緩沖區(qū) read_rnd_buffer_size mysql隨機讀的緩沖區(qū)大小
連接優(yōu)化
max_connection
最大連接數(shù),默認是151,linux一般可以支持500--1000具體根據(jù)服務(wù)器性能評估 show variables like 'max_connections'; 查看最大連接數(shù)
back_log
超過最大連接數(shù)后最大的等待數(shù)量,存放在堆棧中(一般是50+(max_connections/5)),最大不超過900 show variables like 'back_log'
table_open_cache
控制所有sql語句執(zhí)行線程可打開表緩存數(shù)量,而在執(zhí)行sql語句時,每一個sql執(zhí)行線程至少要打開1個表緩存,該參數(shù)的值應(yīng)該根據(jù)設(shè)置的最大連接數(shù)max_connectons以及每個連接執(zhí)行關(guān)聯(lián)查詢中涉及的表的最大數(shù)量來設(shè)定
thread_cache_size
為了加快連接數(shù)據(jù)庫的速度,mysql會緩存一定數(shù)量的客戶服務(wù)線程以備重用,通過參數(shù)thread_cache_size可控制Mysql緩存客戶服務(wù)線程的數(shù)量
innodb_lock_wait_timeout
設(shè)置innoDB事務(wù)等待行鎖的時間,默認是50ms,可以根據(jù)需要動態(tài)設(shè)置,對于需要快速反饋的業(yè)務(wù)系統(tǒng),可以將行鎖的等待時間調(diào)小,避免事務(wù)長時間掛起,對于后臺運行的批量處理程序,可以將行鎖的等待時間調(diào)大,以避免發(fā)生大的回滾操作 show variables like 'innodb_lock_wait_timeout';
日志
錯誤日志文件名稱,用戶記錄當(dāng)mysql啟動和停止時,以及服務(wù)器在運行中發(fā)生發(fā)生任何驗證錯誤時相關(guān)信息
log_bin
指定二進制日志文件名稱,用于記錄對數(shù)據(jù)庫造成更改的所有語句
binlog_do_db binlog_ignore_db
指定將更新記錄到二進制日志的數(shù)據(jù)庫,其他所有沒有顯示指定的數(shù)據(jù)庫更新將忽略,不記錄在日志中
sync_binlog
指定多少次寫日志后同步磁盤
general_log=1
是否開啟查詢?nèi)罩居涗?
general_log_filefile_name(默認host_name.log)
指定查詢?nèi)罩疚募?,用戶記錄所有的查詢語句 查詢?nèi)罩疚募簊low_query_log_file=slow_query.log mysqldumpslow slow_query.log;查看慢查詢?nèi)罩疚募?
slow_query_log=1
是否開啟慢查詢?nèi)罩荆?代表開啟,0代表關(guān)閉
long_query_time=3
設(shè)置慢查詢的時間,超過這個時間的查詢語句才會記錄日志
log_slow_admin_statements
是否將管理語句寫入慢查詢?nèi)罩?/pre>
到此這篇關(guān)于Mysql的并發(fā)參數(shù)調(diào)整詳解的文章就介紹到這了,更多相關(guān)Mysql并發(fā)參數(shù)調(diào)整內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL slave_net_timeout參數(shù)解決的一個集群問題案例
這篇文章主要介紹了MySQL slave_net_timeout參數(shù)解決的一個集群問題案例,問題日志請見正文,本文使用slave_net_timeout參數(shù)解決了這個問題,需要的朋友可以參考下2015-05-05MySql數(shù)據(jù)庫基礎(chǔ)知識點總結(jié)
這篇文章主要介紹了MySql數(shù)據(jù)庫基礎(chǔ)知識點,總結(jié)整理了mysql數(shù)據(jù)庫基本創(chuàng)建、查看、選擇、刪除以及數(shù)據(jù)類型相關(guān)操作技巧,需要的朋友可以參考下2020-06-06