mysql 熱塊_mysql 優化

數據庫層面:應用系統層面優化SQL優化

SQL優化一般通過分析慢查詢日志來抓取長事務高消耗的sql,通過結合具體業務,對sql邏輯進行分析and精簡,or重寫sql。通過配置slow_query_log=1和log_queries_not_using_indexes=1啟動慢查詢日志記錄和記錄下沒有使用索引的查詢,后者會讓慢查詢日志文件很快膨脹,需要定時對文件進行切割。分析慢日志的工具一般使用pt工具包的pt-query-digest或者mysql自帶的mysqldumpslow,個人比較傾向用pt,分析出來的內容比較詳細。需要注意pt-query-digest其實是一個perl腳本,如果慢日志文件較大(幾G多),需要大量消耗CPU資源。建議在業務低峰時候調度該工具。

索引優化

索引是數據庫最為常見的對象。基本上90%的sql性能問題都是沒有建索引or低效索引導致的。所以根據實際業務場景建合適的索引,能夠使得sql優化事半功倍。

索引的設計規則:選擇唯一性索引or主鍵;為經常需要排序、分組和聯合操作的字段建立索引,盡量建立復合索引而非單列索引;為常作為查詢條件的字段建立索引;限制索引的數目;盡量使用數據量少的索引;盡量使用前綴來索引;刪除不再使用或者很少使用的索引。

創建索引的一些注意事項:

(1)避免在where子句中使用!=或者<>操作符,否則引擎會放棄索引而進行全表掃描

(2)避免在where子句中使用or來連接條件,考慮用union代替。

(3)避免在where子句中對字段進行表達式操作或者函數操作

(4)先應考慮在 where 及 order by 涉及的列上建立索引

(5)在使用索引字段作為條件時,如果該索引是復合索引,那么必須使用到該索引中的第一個字段作為條件 時才能保證系統使用該索引, 否則該索引將不被使用,并且應盡可能的讓字段順序與索引順序相一致。即最左原則。

(6)索引固然可以提高相應的 select 的效率,但是也需要成本去維護索引,因此表的索引個數并非越多越好,一般不要超過7個。

(7)如果使用到了臨時表,在最后將所有的臨時表顯式刪除時,先 truncate table ,然后 drop table ,這樣可以避免系統表的較長時間鎖定。

(8)避免頻繁創建和刪除臨時表,以減少系統表資源的消耗。對于一次性事件, 最好使用導出表。

(9)最好不要給數據庫留NULL,盡可能的使用 NOT NULL填充數據庫.備注、描述、評論之類的可以設置為 NULL,其他的,最好不要使用NULL。

(10)對于varchar的字段創建索引,指定索引長度,避免創建全字段索引,可以通過count(distinct left(列名,索引長度))/count(*)計算區分度來確定索引長度。

(11)多表關聯查詢的時候,必須保證關聯的字段有索引。而且字段的類型必須一致,避免由于隱式轉換導致索引失效。

庫表優化

舉個例子:業務前期不注重表設計,導致日志、報文、圖片這類數據都通過表的方式存儲在數據庫。而這類數據一般是通過text/blob等類型的字段存儲,極易使得表容量暴增,而且很難去優化這類表的查詢sql。需要做好庫表設計,對圖片、報文這類數據,改為通過mongodb等NOSQL數據庫進行存儲。或者將表的部分大字段進行拆分,單獨出來一個表,通過冗余部分字段,實現表與表之間的數據關聯(不建議通過mysql的外鍵約束實現關聯,因為在高并發的情況下,會出現大量行鎖影響數據庫性能,強烈建議通過應用程序實現數據關聯。)

采用統一的字符集和校驗集,使用innodb引擎,表設計中采用與業務無關的自增ID列作為主鍵,減少存儲過程and自定義函數,盡量不用text/blob這類字段類型。

表設計規范

請參考附件?阿里巴巴Java開發手冊 和?58到家數據庫30條軍規解讀 (https://www.oschina.net/question/54100_2231325)

數據庫對象優化

內存配置優化

innodb緩沖池設置:innodb_buffer_pool_size,一般為整機內存的70%~80%

緩沖池臟頁占比:innodb_max_dirty_pages_pct,默認為75%,建議按照業務場景進行設置。

強烈建議關閉query cache。通過配置文件設置query_cache_size = 0、query_cache_type = 0即可。

redo log緩沖區設置:innodb_log_buffer_size,如果沒大事務,控制在8M-16M即可,生產環境目前配置到64M。

IO配置優化

sync_binlog:

sync_binlog=0,當事務提交之后,MySQL不做fsync之類的磁盤同步指令刷新binlog_cache中的信息到磁盤,而讓Filesystem自行決定什么時候來做同步,或者cache滿了之后才同步到磁盤。

sync_binlog=n,當每進行n次事務提交之后,MySQL將進行一次fsync之類的磁盤同步指令來將binlog_cache中的數據強制寫入磁盤。

sync_relay_log:

同sync_binlog參數功能一樣,只不過對象是relay log而不是binlog。

innodb_flush_log_at_trx_commit:

如果innodb_flush_log_at_trx_commit設置為0,log buffer將每秒一次地寫入log file中,并且log file的flush(刷到磁盤)操作同時進行.該模式下,在事務提交的時候,不會主動觸發寫入磁盤的操作。如果innodb_flush_log_at_trx_commit設置為1,每次事務提交時MySQL都會把log buffer的數據寫入log file,并且flush(刷到磁盤)中去.如果innodb_flush_log_at_trx_commit設置為2,每次事務提交時MySQL都會把log buffer的數據寫入log file.但是flush(刷到磁盤)操作并不會同時進行。該模式下,MySQL會每秒執行一次 flush(刷到磁盤)操作。

sync_master_info:

每間隔多少事務刷新master.info,如果是table(innodb)設置無效,每個事務都會更新

sync_relay_log_info:

每間隔多少事務刷新relay-log.info,如果是table(innodb)設置無效,每個事務都會更新

master_info_repository:

記錄主庫binlog的信息,可以設置FILE(master.info)或者TABLE(mysql.slave_master_info)

relay_log_info_repository:

記錄備庫relaylog的信息,可以設置FILE(relay-log.info)或者TABLE(mysql.slave_relay_log_info)

innodb_io_capacity:默認為200,如果是SSD盤,建議調整到5000

高并發設置

擴大文件描述符:

1、動態修改,重啟失效,只能使用root,并且當前session有效:ulimit -n 65535

2、修改配置文件,永久生效,在/etc/security/limits.conf配置文件中增加:*?soft?nofile?65535

*?soft?nproc?65535

*?hard?nofile?65535

*?hard?nproc?65535

主機層面:

1、CPU

2、內存

(1)關閉NUMA特性。NUMA陷阱現象是當你的服務器還有內存的時候,發現它已經在開始使用swap了,甚至已經導致機器出現停滯的現象。這個就有可能是由于numa的限制,如果一個進程限制它只能使用自己的numa節點的內存,那么當自身numa node內存使用光之后,就不會去使用其他numa node的內存了,會開始使用swap,甚至更糟的情況,機器沒有設置swap的時候,可能會直接宕機。所以,強烈建議在操作系統層面關閉NUMA特性。直接在/etc/grub.conf的kernel行最后添加numa=off即可。

(2)盡量配置高內存。這種mysql可以充分利用內存資源緩存熱塊數據,避免由于內存不足導致臟數據不斷地刷盤從而產生IO瓶頸,也可以避免熱塊數據被擠出緩存區的情況發生。

(3)修改swappiness設置。swappiness是linux的一個內核參數,用來控制物理內存交換出去的策略.它允許一個百分比的值,最小的為0,最大的為100,改值默認是60.m.swappiness設置為0表示盡量少使用swap,100表示盡量將inactive的內存頁交換到swap里或者釋放cache。inactive內存的意思是程序映射著,但是”長時間”不用的內存。這個值推薦設置為1,設置方法如下,在/etc/sysctl.conf文件中增加一行:vm.swappiness = 1

3、磁盤IO

(1)盡量將數據文件和日志文件分開,各自承載相應的磁盤。避免日志刷盤和數據刷盤之間爭用IO。

(2)盡量使用高IO的磁盤,或者使用raid10這類磁盤陣列,或者直接采用SSD盤

4、網絡優化

集群內機器最好部署在同一內網or專線直連的網絡環境,以保證低延遲,高吞吐的網絡環境。避免由于網絡問題導致的集群內腦裂or主從復制異常的情況。

操作系統層面:

1、文件系統

強烈建議采用xfs文件系統,ext4文件系統存在bug,觸發會占用自身大部分IO,造成IO瓶頸。詳見http://1057212.blog.51cto.com/1047212/1891734

優化文件系統掛載參數:文件系統掛載參數是在/etc/fstab文件中修改,重啟時候生效。noatime表示不記錄訪問時間,nodiratime不記錄目錄的訪問時間。barrier=0,表示關閉barrier功能。其中nobarrier是xfs文件系統特有,ext4文件系統并無此參數。

2、IO調度算法

NOOP:NOOP算法的全寫為No Operation。該算法實現了最最簡單的FIFO隊列,所有IO請求大致按照先來后到的順序進行操作。

CFQ:CFQ算法的全寫為Completely Fair Queuing。該算法的特點是按照IO請求的地址進行排序,而不是按照先來后到的順序來進行響應。

DEADLINE:DEADLINE在CFQ的基礎上,解決了IO請求餓死的極端情況。除了CFQ本身具有的IO排序隊列之外,DEADLINE額外分別為讀IO和寫IO提供了FIFO隊列。讀FIFO隊列的最大等待時間為500ms,寫FIFO隊列的最大等待時間為5s。FIFO隊列內的IO請求優先級要比CFQ隊列中的高,,而讀FIFO隊列的優先級又比寫FIFO隊列的優先級高。優先級可以表示為:FIFO(Read) > FIFO(Write) > CFQ

一般mysql服務器的磁盤IO調度算法采用deadline,既可以保證IO請求不被餓死,又可以使得讀IO的處理優先級大于寫IO。

系統架構層面優化負載均衡

這里可以分為兩類:

1、PXC or mysql cluster or mysql group replication這類數據庫集群,由于支持多點寫入的方式,這里的負載均衡可以實現讀和寫都均衡負載的情況,通過在數據庫前端部署haproxy或者LVS的方式實現負載均衡。但是需要強調的是,目前這類型集群在多點寫入的情況很容易產生鎖沖突和更新丟失的情況,一般官方建議開啟單點寫入。也就是說,一般也只能實現單節點承載寫操作,剩余節點均衡負載讀操作。

2、mysql一主多從架構:由于主庫必須單獨承載寫操作,故均衡負載只是針對于讀操作。也是通過在數據庫前端部署haproxy或者LVS的方式實現讀操作負載均衡。

緩存

一般采用內存數據庫如Redis、memcached同mysql結合,將熱點數據放在內存數據庫上實現高并發。可以參考博客:http://blog.csdn.net/stubborn_cow/article/details/50586990

分布式優化

分庫分表:

這里也可以分為2類:

(1)通過前端應用代碼邏輯實現的方式,實現表分拆的方式。這樣做對應用程序的侵入性比較大,但是數據處理邏輯的過程把控在自己手上,有異常可以自主定位。

(2)通過中間件的方式實現,目前常用的mycat、cobar實現數據分片。

讀寫分離:

一般通過數據庫中間件的方式實現,常用的中間件例如:maxscale、mycat、cobar、altas等

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260436.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260436.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260436.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vscode C++ 分文件、文件夾編譯配置與錯誤解決

文章目錄問題includesourceout配置過程遇到的問題與解決遇到的問題1解決步驟1. ctrl shift p2. 配置json文件修改task.json文件修改launch.json可能遇到的錯誤1. collect2: error: ld returned 1 exit status2. /mnt/d/tmp/c/source/add.cpp:3:10: fatal error: add.h: No su…

gc就是fullgc嗎 major_線上出現fullgc問題如何排查?

1.問題描述線上出現fullgc報警&#xff0c;每5分鐘一次2.背景知識1. 程序執行了System.gc()執行了jmap -histo:live pid命令 在執行minor gc的時候進行的一系列檢查 執行Minor GC的時候&#xff0c;JVM會檢查老年代中最大連續可用空間是否大于了當前新生代所有對象的總大小。 …

修改 jquery.validate.js 支持非form標簽

嘗試使用markdown來寫一篇blog&#xff0c;啦啦啦 源代碼傳送門&#xff1a;github 在特殊情況下我們使用jquery.validate.js對用戶輸入的內容做驗證的時候&#xff0c;表單并不是一定包含在form之中&#xff0c;有可能是一個div彈層&#xff0c;有可能是嵌套在form里面的一個d…

Linux常用文件和目錄操作

cd:變換目錄pwd:顯示弼前目錄mkdir:建立一個新目錄rmdir:刪除一個空目錄 cp&#xff1a;復制目錄或者文件 mv&#xff1a;移動文件或者目錄 rm&#xff1a;刪除文件或者目錄 轉載于:https://www.cnblogs.com/lijingpeng/archive/2012/09/07/2675982.html

淘淘商城項目mysql服務器_SpringMVC+Spring+Mybatis+Mysql+Maven+Svn[ 淘淘商城項目環境搭建 ]...

背景&#xff1a;淘淘商城項目的環境搭建說明&#xff1a;采用SpringMVCSpringMybatisMysqlMavenSvn結構搭建&#xff0c;在開發之中可以參考其結構和搭建步驟去搭建實際的工程項目工程結構簡圖&#xff1a;項目結構&#xff1a;---------------------------------------------…

bean validation校驗方法參數_項目啟動時首先校驗Spring Boot配置參數

1. 概述在項目實際開發過程中&#xff0c;為了更好的復用&#xff0c;我們參考Spring Boot Starters&#xff0c;封裝了許多企業內部中間件的starter。這些中間件的接入都需要申請并在項目中配置一些特定的參數。我們通過ConfigurationProperties注解&#xff0c;增加了在配置過…

進一步理解:inline-block,vertical-align,line-height

看似三個最常見的概念背后卻隱藏了很深的很深“水” 那有多深呢&#xff0c;先來看下面的代碼 引出問題 <style>.inline-block {display: inline-block;}.border {border: 1px solid #000000;}.span {width: 100px;height: 100px;}.bak {background: #33CCFF;} .o-hidden…

刷系統——黑屏問題

引用&#xff1a;http://www.miui.com/thread-344361-1-1.html 此貼大部分內容源自魔趣論壇V大的帖子&#xff0c;本人經過整理后發出&#xff0c;特此聲明原帖地址&#xff1a;http://bbs.mfunz.com/thread-172610-1-1.html——此貼獻給小白們&#xff0c;老鳥一笑而過吧近期有…

LeetCode OJ - Recover Binary Search Tree

題目&#xff1a; Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing its structure. Note:A solution using O(n) space is pretty straight forward. Could you devise a constant space solution? 解題思路&#xff…

mysql中間件是運維工作內容_linux運維工作的七項內容

一&#xff0c;【基礎運維檢查】或叫 例行檢查 或叫 例行巡檢mail cacti1.理解例行檢查列表的內容、檢查項的含義以及可能引發的問題。2.按照例行檢查表&#xff0c;定期檢查系統狀態&#xff0c;發現異常立即通報并推進解決。3.定期檢查線上服務模塊&#xff0c;排除可疑進程,…

java executor_Java并發編程(08):Executor線程池框架

一、Executor框架簡介1、基礎簡介Executor系統中&#xff0c;將線程任務提交和任務執行進行了解耦的設計&#xff0c;Executor有各種功能強大的實現類&#xff0c;提供便捷方式來提交任務并且獲取任務執行結果&#xff0c;封裝了任務執行的過程&#xff0c;不再需要Thread().st…

Exchange 2007遷移Exchange 2010應該注意的13件事

1. Exchange 2007可以支持升級到Exchange 2010&#xff0c;但需要提前將Exchange 2007所有服務器環境升級至 SP2或以上版本。2. Exchange 2007如果更新至SP2或以上版本&#xff0c;則建議按照以下順序進行各角色的更新&#xff1a; CAS、UM、HUB、Edge、Mailbox。3. …

dom4j操作XML

(一&#xff09;創建Document的基本操作 /** * XML基本操作 */ public void BaseOperation(){ //創建一個document Document documentDocumentHelper.createDocument(); //創建根結點 Element rootdocument.addElement("root"); //為根結點添加一個book節點 Element …

Oracle數據庫中閃回恢復的詳細分析

Oracle9i開始提供閃回查詢&#xff0c;以便能在需要的時候查到過去某個時刻的一致性數據&#xff0c;這是通過Undo實現的。這個功能有很大的限制&#xff0c;就是相關事務的undo不能被覆蓋&#xff0c;否則就無力回天了。oracle10g大大的增強了閃回查詢的功能&#xff0c;并且提…

python 查看當前目錄_「Python」打包分發工具setuptools學習

?setuptools是python標準的打包分發工具&#xff0c;它可以將我們編寫的python項目打包安裝&#xff0c;這樣其他同事就可以像調用標準庫或python第三方庫那樣直接使用&#xff1b;也可以將項目上傳到Pypi供更多人的下載安裝使用。?1. 項目結構項目結構?這是一個打包構建好的…

如何殺掉D狀態的進程?[zt]【轉】

轉自&#xff1a;http://blog.csdn.net/chinalinuxzend/article/details/4288791 [-] 如何殺掉D狀態的進程zt相關博文原貼:http://www.xclinux.cn/?p752 如何殺掉D狀態的進程&#xff1f;[zt] 狀態為 D (Uninterruptible sleep) &#xff0c;以及狀態為 Z (Zombie)這些垃圾進程…

九月十月百度人搜,阿里巴巴,騰訊華為筆試面試八十題(第331-410題)

九月十月百度人搜&#xff0c;阿里巴巴&#xff0c;騰訊華為小米搜狗筆試面試八十題 &#xff08;參與算法&面試題交流與討論&#xff0c;請加群&#xff1a;30382647&#xff09;引言 自發表上一篇文章至今&#xff08;事實上&#xff0c;上篇文章更新了近3個月之久&#…

mysql性能結構優化原理_MySQL性能管理及架構設計(二):數據庫結構優化、高可用架構設計、數據庫索引優化...

一、數據庫結構優化(非常重要)1.1 數據庫結構優化目的1、減少數據冗余&#xff1a;(數據冗余是指在數據庫中存在相同的數據&#xff0c;或者某些數據可以由其他數據計算得到)&#xff0c;注意&#xff0c;盡量減少不代表完全避免數據冗余&#xff1b;2、盡量避免數據維護中出現…

python git是什么_python爬蟲之git的使用

一、簡單認識&#xff1a; 1、初始化文件夾為版本控制文件夾&#xff0c;首先建立一個文件夾&#xff0c;進入這個文件夾以后輸入git init初始化這個文件夾。2、Git幾種位置概念 1、本地代碼&#xff1a;本地更改完代碼以后&#xff0c;雖然是存放在git的文件夾里面&#xff0c…

產品經理網站數據分析之測量問題現狀(二)

本章續接上文&#xff0c;主要講解流程圖的繪制要領&#xff0c;以及示例。 1、基礎流程圖 基礎流程圖應該簡明扼要地描述出流程的主要結構&#xff0c;在弄清楚流程的起點、終點&#xff0c;以及主要步驟后&#xff0c;按照流程的先后順序&#xff0c;按照要展示的流程長短比例…