萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> 運維多年經驗詳談MySQL數據應該如何優化

運維多年經驗詳談MySQL數據應該如何優化

本文的作者是一位資深的運維人,現在我們來看看他的建議應該如何優化mysql數據庫,主要的五個階段是:數據庫表設計,數據庫部署,數據庫性能優化,數據庫架構擴展,數據庫維護

數據庫的設計可能只會根據當時的業務需求來設計,可能當時並不需要高可用、高伸縮等特性的,但是隨著業務及用戶量的增加,基礎架構才逐漸完善。這篇博文主要談MySQL數據庫發展周期中所面臨的問題及優化方案,暫且拋開前端應用不說,大致分為以下五個階段:

1、數據庫表設計
項目立項後,開發部根據產品部需求開發項目,開發工程師工作其中一部分就是對表結構設計。對於數據庫來說,這點很重要,如果設計不當,會直接影響訪問速度和用戶體驗。影響的因素很多,比如慢查詢、低效的查詢語句、沒有適當建立索引、數據庫堵塞(死鎖)等。當然,有測試工程師的團隊,會做壓力測試,找bug。對於沒有測試工程師的團隊來說,大多數開發工程師初期不會太多考慮數據庫設計是否合理,而是盡快完成功能實現和交付,等項目有一定訪問量後,隱藏的問題就會暴露,這時再去修改就不是這麼容易的事了。

2、數據庫部署
該運維工程師出場了,項目初期訪問量不會很大,所以單台部署足以應對在1500左右的QPS(每秒查詢率)。考慮到高可用性,可采用MySQL主從復制+Keepalived做雙擊熱備,常見集群軟件有Keepalived、Heartbeat。
雙機熱備博文:http://lizhenliang.blog.51cto.com/7876557/1362313

3、數據庫性能優化
如果將MySQL部署到普通的X86服務器上,在不經過任何優化情況下,MySQL理論值正常可以處理2000左右QPS,經過優化後,有可能會提升到2500左右QPS,否則,訪問量當達到1500左右並發連接時,數據庫處理性能就會變慢,而且硬件資源還很富裕,這時就該考慮軟件問題了。那麼怎樣讓數據庫最大化發揮性能呢?一方面可以單台運行多個MySQL實例讓服務器性能發揮到最大化,另一方面是對數據庫進行優化,往往操作系統和數據庫默認配置都比較保守,會對數據庫發揮有一定限制,可對這些配置進行適當的調整,盡可能的處理更多連接數。
具體優化有以下三個層面:

3.1 數據庫配置優化
MySQL常用有兩種存儲引擎,一個是MyISAM,不支持事務處理,讀性能處理快,表級別鎖。另一個是InnoDB,支持事務處理(ACID),設計目標是為處理大容量數據發揮最大化性能,行級別鎖。

    表鎖:開銷小,鎖定粒度大,發生死鎖概率高,相對並發也低。
    行鎖:開銷大,鎖定粒度小,發生死鎖概率低,相對並發也高。

為什麼會出現表鎖和行鎖呢?主要是為了保證數據的完整性,舉個例子,一個用戶在操作一張表,其他用戶也想操作這張表,那麼就要等第一個用戶操作完,其他用戶才能操作,表鎖和行鎖就是這個作用。否則多個用戶同時操作一張表,肯定會數據產生沖突或者異常。
根據以上看來,使用InnoDB存儲引擎是最好的選擇,也是MySQL5.5以後版本中默認存儲引擎。每個存儲引擎相關聯參數比較多,以下列出主要影響數據庫性能的參數。
公共參數默認值:

max_connections = 151
#同時處理最大連接數,推薦設置最大連接數是上限連接數的80%左右
sort_buffer_size = 2M
#查詢排序時緩沖區大小,只對order by和group by起作用,可增大此值為16M
query_cache_limit = 1M
#查詢緩存限制,只有1M以下查詢結果才會被緩存,以免結果數據較大把緩存池覆蓋
query_cache_size = 16M
#查看緩沖區大小,用於緩存SELECT查詢結果,下一次有同樣SELECT查詢將直接從緩存池返回結果,可適當成倍增加此值
open_files_limit = 1024
#打開文件數限制,如果show global status like 'open_files'查看的值等於或者大於open_files_limit值時,程序會無法連接數據庫或卡死

MyISAM參數默認值:

key_buffer_size = 16M
#索引緩存區大小,一般設置物理內存的30-40%
read_buffer_size = 128K
#讀操作緩沖區大小,推薦設置16M或32M

InnoDB參數默認值:

innodb_buffer_pool_size = 128M
#索引和數據緩沖區大小,一般設置物理內存的60%-70%
innodb_buffer_pool_instances = 1
#緩沖池實例個數,推薦設置4個或8個
innodb_flush_log_at_trx_commit = 1
#關鍵參數,0代表大約每秒寫入到日志並同步到磁盤,數據庫故障會丟失1秒左右事務數據。1為每執行一條SQL後寫入到日志並同步到磁盤,I/O開銷大,執行完SQL要等待日志讀寫,效率低。2代表只把日志寫入到系統緩存區,再每秒同步到磁盤,效率很高,如果服務器故障,才會丟失事務數據。對數據安全性要求不是很高的推薦設置2,性能高,修改後效果明顯。
innodb_file_per_table = OFF
#默認是共享表空間,共享表空間idbdata文件不斷增大,影響一定的I/O性能。推薦開啟獨立表空間模式,每個表的索引和數據都存在自己獨立的表空間中,可以實現單表在不同數據庫中移動。
innodb_log_buffer_size = 8M
#日志緩沖區大小,由於日志最長每秒鐘刷新一次,所以一般不用超過16M

3.2 系統內核優化
大多數MySQL都部署在linux系統上,所以操作系統的一些參數也會影響到MySQL性能,以下對linux內核進行適當優化。

net.ipv4.tcp_fin_timeout = 30
#TIME_WAIT超時時間,默認是60s
net.ipv4.tcp_tw_reuse = 1
#1表示開啟復用,允許TIME_WAIT socket重新用於新的TCP連接,0表示關閉
net.ipv4.tcp_tw_recycle = 1
#1表示開啟TIME_WAIT socket快速回收,0表示關閉
net.ipv4.tcp_max_tw_buckets = 4096
#系統保持TIME_WAIT socket最大數量,如果超出這個數,系統將隨機清除一些TIME_WAIT並打印警告信息
net.ipv4.tcp_max_syn_backlog = 4096
#進入SYN隊列最大長度,加大隊列長度可容納更多的等待連接

在linux系統中,如果進程打開的文件句柄數量超過系統默認值1024,就會提示“too many files open”信息,所以要調整打開文件句柄限制。

# vi /etc/security/limits.conf #加入以下配置,*代表所有用戶,也可以指定用戶,重啟系統生效
* soft nofile 65535
* hoft nofile 65535
# ulimit -SHn 65535 #立刻生效

3.3 硬件配置
加大物理內存,提高文件系統性能。linux內核會從內存中分配出緩存區(系統緩存和數據緩存)來存放熱數據,通過文件系統延遲寫入機制,等滿足條件時(如緩存區大小到達一定百分比或者執行sync命令)才會同步到磁盤。也就是說物理內存越大,分配緩存區越大,緩存數據越多。當然,服務器故障會丟失一定的緩存數據。
SSD硬盤代替SAS硬盤,將RAID級別調整為RAID1+0,相對於RAID1和RAID5有更好的讀寫性能(IOPS),畢竟數據庫的壓力主要來自磁盤I/O方面。

4、數據庫架構擴展
隨著業務量越來越大,單台數據庫服務器性能已無法滿足業務需求,該考慮加機器了,該做集群了~~~。主要思想是分解單台數據庫負載,突破磁盤I/O性能,熱數據存放緩存中,降低磁盤I/O訪問頻率。

4.1 主從復制與讀寫分離
因為生產環境中,數據庫大多都是讀操作,所以部署一主多從架構,主數據庫負責寫操作,並做雙擊熱備,多台從數據庫做負載均衡,負責讀操作,主流的負載均衡器有LVS、HAProxy、Nginx。怎麼來實現讀寫分離呢?大多數企業是在代碼層面實現讀寫分離,效率比較高。另一個種方式通過代理程序實現讀寫分離,企業中應用較少,常見代理程序有MySQL Proxy、Amoeba。在這樣數據庫集群架構中,大大增加數據庫高並發能力,解決單台性能瓶頸問題。如果從數據庫一台從庫能處理2000 QPS,那麼5台就能處理1w QPS,數據庫橫向擴展性也很容易。
有時,面對大量寫操作的應用時,單台寫性能達不到業務需求。如果做雙主,就會遇到數據庫數據不一致現象,產生這個原因是在應用程序不同的用戶會有可能操作兩台數據庫,同時的更新操作造成兩台數據庫數據庫數據發生沖突或者不一致。在單庫時MySQL利用存儲引擎機制表鎖和行鎖來保證數據完整性,怎樣在多台主庫時解決這個問題呢?有一套基於perl語言開發的主從復制管理工具,叫MySQL-MMM(Master-Master replication managerfor Mysql,Mysql主主復制管理器),這個工具最大的優點是在同一時間只提供一台數據庫寫操作,有效保證數據一致性。
主從復制博文:http://lizhenliang.blog.51cto.com/7876557/1290431
讀寫分離博文:http://lizhenliang.blog.51cto.com/7876557/1305083
MySQL-MMM博文:http://lizhenliang.blog.51cto.com/7876557/1354576

4.2 增加緩存
給數據庫增加緩存系統,把熱數據緩存到內存中,如果內存緩存中有要請求的數據就不再去數據庫中返回結果,提高讀性能。緩存實現有本地緩存和分布式緩存,本地緩存是將數據緩存到本地服務器內存中或者文件中,速度快。分布式可以緩存海量數據,擴展容易,主流的分布式緩存系統有memcached、redis,memcached性能穩定,數據緩存在內存中,速度很快,QPS可達8w左右。如果想數據持久化那就用redis,性能不低於memcached。
工作過程:

1.jpg


4.3 分庫
分庫是根據業務不同把相關的表切分到不同的數據庫中,比如web、bbs、blog等庫。如果業務量很大,還可將切分後的庫做主從架構,進一步避免單個庫壓力過大。

4.4 分表
數據量的日劇增加,數據庫中某個表有幾百萬條數據,導致查詢和插入耗時太長,怎麼能解決單表壓力呢?你就該考慮是否把這個表拆分成多個小表,來減輕單個表的壓力,提高處理效率,此方式稱為分表。
分表技術比較麻煩,要修改程序代碼裡的SQL語句,還要手動去創建其他表,也可以用merge存儲引擎實現分表,相對簡單許多。分表後,程序是對一個總表進行操作,這個總表不存放數據,只有一些分表的關系,以及更新數據的方式,總表會根據不同的查詢,將壓力分到不同的小表上,因此提高並發能力和磁盤I/O性能。
分表分為垂直拆分和水平拆分:
垂直拆分:把原來的一個很多字段的表拆分多個表,解決表的寬度問題。你可以把不常用的字段單獨放到一個表中,也可以把大字段獨立放一個表中,或者把關聯密切的字段放一個表中。
水平拆分:把原來一個表拆分成多個表,每個表的結構都一樣,解決單表數據量大的問題。

4.5 分區
分區就是把一張表的數據分成多個區塊,這些區塊可以在一個磁盤上,也可以在不同的磁盤上,分區後,表面上還是一張表,但數據散列在多個位置,這樣一來,多塊硬盤同時處理不同的請求,從而提高磁盤I/O讀寫性能,實現比較簡單。
注:增加緩存、分庫、分表和分區主要由程序猿來實現。

5、數據庫維護
數據庫維護是運維工程師或者DBA主要工作,包括性能監控、性能分析、性能調優、數據庫備份和恢復等。


5.1 性能狀態關鍵指標

QPS,Queries Per Second:每秒查詢數,一台數據庫每秒能夠處理的查詢次數
TPS,Transactions Per Second:每秒處理事務數
通過show status查看運行狀態,會有300多條狀態信息記錄,其中有幾個值幫可以我們計算出QPS和TPS,如下:
Uptime:服務器已經運行的實際,單位秒
Questions:已經發送給數據庫查詢數
Com_select:查詢次數,實際操作數據庫的
Com_insert:插入次數
Com_delete:刪除次數
Com_update:更新次數
Com_commit:事務次數
Com_rollback:回滾次數
那麼,計算方法來了,基於Questions計算出QPS:

mysql> show global status like 'Questions';
mysql> show global status like 'Uptime';

QPS = Questions / Uptime
基於Com_commit和Com_rollback計算出TPS:

mysql> show global status like 'Com_commit';
mysql> show global status like 'Com_rollback';
mysql> show global status like 'Uptime';
TPS = (Com_commit + Com_rollback) / Uptime

另一計算方式:基於Com_select、Com_insert、Com_delete、Com_update計算出QPS

mysql> show global status where Variable_name in('com_select','com_insert','com_delete','com_update');

等待1秒再執行,獲取間隔差值,第二次每個變量值減去第一次對應的變量值,就是QPS
TPS計算方法:

mysql> show global status where Variable_name in('com_insert','com_delete','com_update');

計算TPS,就不算查詢操作了,計算出插入、刪除、更新四個值即可。
經網友對這兩個計算方式的測試得出,當數據庫中myisam表比較多時,使用Questions計算比較准確。當數據庫中innodb表比較多時,則以Com_*計算比較准確。

5.2 開啟慢查詢日志

MySQL開啟慢查詢日志,分析出哪條SQL語句比較慢,使用set設置變量,重啟服務失效,可以在my.cnf添加參數永久生效。

mysql> set global slow-query-log=on #開啟慢查詢功能
mysql> set global slow_query_log_file='/var/log/mysql/mysql-slow.log'; #指定慢查詢日志文件位置
mysql> set global log_queries_not_using_indexes=on; #記錄沒有使用索引的查詢
mysql> set global long_query_time=1; #只記錄處理時間1s以上的慢查詢

分析慢查詢日志,可以使用MySQL自帶的mysqldumpslow工具,分析的日志較為簡單。
mysqldumpslow -t 3 /var/log/mysql/mysql-slow.log#查看最慢的前三個查詢
也可以使用percona公司的pt-query-digest工具,日志分析功能全面,可分析slow log、binlog、general log。
分析慢查詢日志:pt-query-digest /var/log/mysql/mysql-slow.log
分析binlog日志:mysqlbinlog mysql-bin.000001 >mysql-bin.000001.sql
pt-query-digest ?type=binlog mysql-bin.000001.sql
分析普通日志:pt-query-digest ?type=genlog localhost.log

5.3 數據庫備份
備份數據庫是最基本的工作,也是最重要的,否則後果很嚴重,你懂得!但由於數據庫比較大,上百G,往往備份都很耗費時間,所以就該選擇一個效率高的備份策略,對於數據量大的數據庫,一般都采用增量備份。常用的備份工具有mysqldump、mysqlhotcopy、xtrabackup等,mysqldump比較適用於小的數據庫,因為是邏輯備份,所以備份和恢復耗時都比較長。mysqlhotcopy和xtrabackup是物理備份,備份和恢復速度快,不影響數據庫服務情況下進行熱拷貝,建議使用xtrabackup,支持增量備份。
Xtrabackup備份工具使用博文:http://lizhenliang.blog.51cto.com/7876557/1612800

5.4 數據庫修復
有時候MySQL服務器突然斷電、異常關閉,會導致表損壞,無法讀取表數據。這時就可以用到MySQL自帶的兩個工具進行修復,myisamchk和mysqlcheck。
myisamchk:只能修復myisam表,需要停止數據庫
常用參數:
-f ?force 強制修復,覆蓋老的臨時文件,一般不使用
-r ?recover 恢復模式
-q ?quik 快速恢復
-a ?analyze 分析表
-o ?safe-recover 老的恢復模式,如果-r無法修復,可以使用此參數試試
-F ?fast 只檢查沒有正常關閉的表
快速修復weibo數據庫:

# cd /var/lib/mysql/weibo
# myisamchk -r -q *.MYI

mysqlcheck:myisam和innodb表都可以用,不需要停止數據庫,如修復單個表,可在數據庫後面添加表名,以空格分割
常用參數:
-a ?all-databases 檢查所有的庫
-r ?repair 修復表
-c ?check 檢查表,默認選項
-a ?analyze 分析表
-o ?optimize 優化表
-q ?quik 最快檢查或修復表
-F ?fast 只檢查沒有正常關閉的表
快速修復weibo數據庫:

mysqlcheck -r -q -uroot -p123 weibo

5.5 另外,查看CPU和I/O性能方法
#查看CPU性能
2.jpg

#參數-P是顯示CPU數,ALL為所有,也可以只顯示第幾顆
2.jpg

#查看I/O性能

#參數-m是以M單位顯示,默認K
#%util:當達到100%時,說明I/O很忙。
#await:請求在隊列中等待時間,直接影響read時間。
I/O極限:IOPS(r/s+w/s),一般在1200左右。(IOPS,每秒進行讀寫(I/O)操作次數)
I/O帶寬:在順序讀寫模式下SAS硬盤理論值在300M/s左右,SSD硬盤理論值在600M/s左右。

以上是本人使用MySQL三年來總結的一些主要優化方案,能力有限,有些不太全面,但這些基本能夠滿足中小型企業數據庫需求。由於關系型數據庫初衷設計限制,一些BAT公司海量數據放到關系型數據庫中,在海量數據查詢和分析方面已經達不到更好的性能。因此NoSQL火起來了,非關系型數據庫,大數據量,具有高性能,同時也彌補了關系型數據庫某方面不足,漸漸大多數公司已經將部分業務數據庫存放到NoSQL中,如MongoDB、HBase等。數據存儲方面采用分布式文件系統,如HDFS、GFS等。海量數據計算分析采用Hadoop、Spark、Storm等。這些都是與運維相關的前沿技術,也是在存儲方面主要學習對象,小伙伴們共同加油吧!哪位博友有更好的優化方案,歡迎交流哦。

附 101 個 MySQL 的調節和優化的提示

MySQL是一個功能強大的開源數據庫。隨著越來越多的數據庫驅動的應用程序,人們一直在推動MySQL發展到它的極限。這裡是101條調節和優化MySQL安裝的技巧。一些技巧是針對特定的安裝環境的,但這些思路是通用的。我已經把他們分成幾類,來幫助你掌握更多MySQL的調節和優化技巧。

 
MySQL 服務器硬件和操作系統調節:


1. 擁有足夠的物理內存來把整個InnoDB文件加載到內存中——在內存中訪問文件時的速度要比在硬盤中訪問時快的多。
2. 不惜一切代價避免使用Swap交換分區 ? 交換時是從硬盤讀取的,它的速度很慢。
3. 使用電池供電的RAM(注:RAM即隨機存儲器)。
4. 使用高級的RAID(注:Redundant Arrays of Inexpensive Disks,即磁盤陣列) ? 最好是RAID10或更高。
5. 避免RAID5(注:一種存儲性能、數據安全和存儲成本兼顧的存儲解決方案) ? 確保數據庫完整性的校驗是要付出代價的。
6. 將操作系統和數據分區分開,不僅僅是邏輯上,還包括物理上 ? 操作系統的讀寫操作會影響數據庫的性能。
7. 把MySQL臨時空間和復制日志與數據放到不同的分區 ? 當數據庫後台從磁盤進行讀寫操作時會影響數據庫的性能。
8. 更多的磁盤空間等於更快的速度。

9. 更好更快的磁盤。
10. 使用SAS(注: Serial Attached SCSI,即串行連接SCSI)代替SATA(注:SATA,即串口硬盤)。
11. 較小的硬盤 比 較大的硬盤快,尤其是在RAID配置的情況下。
12. 使用電池支持的高速緩存RAID控制器。
13. 避免使用軟件磁盤陣列。
14. 考慮為數據分區使用固態IO卡 (不是磁盤驅動器)  ? 這些卡能夠為幾乎任何數量的數據支持2GB/s的寫入速度。
15. 在Linux中設置swappiness的值為0 ? 在數據庫服務器中沒有理由緩存文件,這是一個服務器或台式機的優勢。
16. 如果可以的話,使用  noatime 和 nodirtime 掛載文件系統 ? 沒有理由更新訪問數據庫文件的修改時間。
17. 使用 XFS 文件系統 ? 一種比ext3更快、更小的文件系統,並且有許多日志選項, 而且ext3 已被證實與MySQL有雙緩沖問題。
18. 調整 XFS 文件系統日志和緩沖變量 ? 為了最高性能標准。
19. 在 Linux 系統中, 使用 NOOP 或者 DEADLINE IO 定時調度程序 ? 同 NOOP 和 DEADLINE定時調度程序相比,這個 CFQ 和 ANTICIPATORY 定時調度程序 顯得非常慢。
20. 使用64位的操作系統 ? 對於MySQL,會有更大的內存支持和使用。
21. 刪除服務器上未使用的安裝包和守護進程 ? 更少的資源占用。
22. 把使用MySQL的host和你的MySQL host放到一個hosts文件中 ? 沒有DNS查找。
23. 切勿強制殺死一個MySQL進程 ? 你會損壞數據庫和正在運行備份的程序。
24. 把服務器貢獻給MySQL ? 後台進程和其他服務能夠縮短數據庫占用CPU的時間。
MySQL 配置:
25. 當寫入時,使用 innodb_flush_method=O_DIRECT 來避免雙緩沖。
26. 避免使用 O_DIRECT 和 EXT3 文件系統 ? 你將序列化所有要寫入的。
27. 分配足夠的 innodb_buffer_pool_size 來加載整個 InnoDB 文件到內存中? 少從磁盤中讀取。
28. 不要將 innodb_log_file_size 參數設置太大, 這樣可以更快同時有更多的磁盤空間 ? 丟掉多的日志通常是好的,在數據庫崩潰後可以降低恢復數據庫的時間。
29. 不要混用 innodb_thread_concurrency 和 thread_concurrency 參數? 這2個值是不兼容的。
30. 分配一個極小的數量給 max_connections 參數 ? 太多的連接會用盡RAM並鎖定MySQL服務。
31. 保持 thread_cache 在一個相對較高的數字,大約 16 ? 防止打開連接時緩慢。
32. 使用skip-name-resolve參數 ? 去掉 DNS 查找。

33.如果你的查詢都是重復的,並且數據不常常發生變化,那麼可以使用查詢緩存。但是如果你的數據經常發生變化,那麼使用查詢緩存會讓你感到失望。
34.增大temp_table_size值,以防止寫入磁盤
35.增大max_heap_table_size值,以防止寫入磁盤
36.不要把sort_buffer_size值設置的太高,否則的話你的內存將會很快耗盡
37.根據key_read_requests和key_reads值來決定key_buffer的大小,一般情況下key_read_requests應該比key_reads值高,否則你不能高效的使用key_buffer
38.將innodb_flush_log_at_trx_commit設置為0將會提高性能,但是如果你要保持默認值(1)的話,那麼你就要確保數據的完整性,同時你也要確保復制不會滯後。
39.你要有一個測試環境,來測試你的配置,並且在不影響正常生產的情況下,可以常常進行重啟。
MySQL模式優化:
40. 保持你的數據庫整理性。
41. 舊數據歸檔 ? 刪除多余的行返回或搜索查詢。
42. 將您的數據加上索引.
43. 不要過度使用索引,比較與查詢.
44. 壓縮文字和BLOB數據類型 ? 以節省空間和減少磁盤讀取次數.
45. UTF 8和UTF16都低於latin1執行效率.
46. 有節制地使用觸發器.
47. 冗余數據保持到最低限度 ? 不重復不必要的數據.
48. 使用鏈接表,而不是擴展行.
49. 注意數據類型,在您的真實數據中,盡可能使用最小的一個.
50. 如果其他數據經常被用於查詢時,而BLOB / TEXT數據不是,就把BLOB / TEXT數據從其他數據分離出來.
51.檢查和經常優化表.
52. 經常重寫InnoDB表優化.
53. 有時,當添加列時刪除索引,然後在添加回來索引,這樣就會更快.
54. 針對不同的需求,使用不同的存儲引擎.

55. 使用歸檔存儲引擎日志表或審計表-這是更有效地寫道.
56.  會話數據存儲在緩存(memcache)的而不是MySQL中 ? 緩存允許自動自動填值的,並阻止您創建難以讀取和寫入到MySQL的時空數據.
57.存儲可變長度的字符串時使用VARCHAR而不是CHAR ? 節省空間,因為固定長度的CHAR,而VARCHAR長度不固定(UTF8不受此影響).
58. 逐步進行模式的變化 ? 一個小的變化,可以有巨大的影響.
59.在開發環境中測試所有模式,反映生產變化.
60. 不要隨意更改你的配置文件中的值,它可以產生災難性的影響.
61. 有時候,在MySQL的configs少即是多.
62.有疑問時使用一個通用的MySQL配置文件.

MySQL metrics widget

查詢優化:

63. 使用慢查詢日志去發現慢查詢。
64. 使用執行計劃去判斷查詢是否正常運行。
65. 總是去測試你的查詢看看是否他們運行在最佳狀態下 ?久而久之性能總會變化。
66. 避免在整個表上使用count(*),它可能鎖住整張表。
67. 使查詢保持一致以便後續相似的查詢可以使用查詢緩存。
68. 在適當的情形下使用GROUP BY而不是DISTINCT。
69. 在WHERE, GROUP BY和ORDER BY子句中使用有索引的列。
70. 保持索引簡單,不在多個索引中包含同一個列。
71. 有時候MySQL會使用錯誤的索引,對於這種情況使用USE INDEX。
72. 檢查使用SQL_MODE=STRICT的問題。
73. 對於記錄數小於5的索引字段,在UNION的時候使用LIMIT不是是用OR.
74. 為了 避免在更新前SELECT,使用INSERT ON DUPLICATE KEY或者INSERT IGNORE ,不要用UPDATE去實現。
75. 不要使用 MAX,使用索引字段和ORDER BY子句。
76. 避免使用ORDER BY RAND().

77. LIMIT M,N實際上可以減緩查詢在某些情況下,有節制地使用。
78. 在WHERE子句中使用UNION代替子查詢。
79. 對於UPDATES(更新),使用 SHARE MODE(共享模式),以防止獨占鎖。
80. 在重新啟動的MySQL,記得來溫暖你的數據庫,以確保您的數據在內存和查詢速度快。
81. 使用DROP TABLE,CREATE TABLE DELETE FROM從表中刪除所有數據。
82. 最小化的數據在查詢你需要的數據,使用*消耗大量的時間。
83. 考慮持久連接,而不是多個連接,以減少開銷。
84. 基准查詢,包括使用服務器上的負載,有時一個簡單的查詢可以影響其他查詢。
85. 當負載增加您的服務器上,使用SHOW PROCESSLIST查看慢的和有問題的查詢。
86. 在開發環境中產生的鏡像數據中 測試的所有可疑的查詢。
MySQL 備份過程:
87. 從二級復制服務器上進行備份。
88. 在進行備份期間停止復制,以避免在數據依賴和外鍵約束上出現不一致。
89. 徹底停止MySQL,從數據庫文件進行備份。
90. 如果使用 MySQL dump進行備份,請同時備份二進制日志文件 ? 確保復制沒有中斷。
91. 不要信任LVM 快照 ? 這很可能產生數據不一致,將來會給你帶來麻煩。
92. 為了更容易進行單表恢復,以表為單位導出數據 ? 如果數據是與其他表隔離的。
93. 當使用mysqldump時請使用 ?opt。
94. 在備份之前檢查和優化表。
95. 為了更快的進行導入,在導入時臨時禁用外鍵約束。
96. 為了更快的進行導入,在導入時臨時禁用唯一性檢測。
97. 在每一次備份後計算數據庫,表以及索引的尺寸,以便更夠監控數據尺寸的增長。
98. 通過自動調度腳本監控復制實例的錯誤和延遲。
99. 定期執行備份。
100. 定期測試你的備份。
最後 101: 執行MySQL 監控: Monitis Unveils The World’s First Free On-demand MySQL Monitoring.

Add MySQL Monitor

copyright © 萬盛學電腦網 all rights reserved