資料庫的設計可能只會根據當時的業務需求來設計,可能當時並不需要高可用、高伸縮等特性的,但是隨著業務及使用者量的增加,基礎架構才逐漸完善。這篇博文主要談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。
工作過程:
4.3 分庫
分庫是根據業務不同把相關的表切分到不同的資料庫中,比如web、bbs、blog等庫。如果業務量很大,還可將切分後的庫做主從架構,進一步避免單個庫壓力過大。
4.4 分表
資料量的日劇增加,資料庫中某個表有幾百萬條資料,導致查詢和插入耗時太長,怎麼能解決單表壓力呢?你就該考慮是否把這個表拆分成多個小表,來減輕單個表的壓力,提高處理效率,此方式稱為分表。
分表技術比較麻煩,要修改程式碼裡的SQL語句,還要手動去建立其他表,也可以用merge儲存引擎實現分表,相對簡單許多。分表後,程式是對一個總表進行操作,這個總表不存放資料,只有一些分表的關係,以及更新資料的方式,總表會根據不同的查詢,將壓力分到不同的小表上,因此提高並發能力和磁碟I/O效能。
分表分為垂直分割和水平分割:
垂直分割:把原來的一個很多欄位的表拆分多個表,解決表的寬度問題。你可以把不常用的欄位單獨放到一個表中,也可以把大欄位獨立放一個表中,或者把關聯密切的欄位放一個表中。
水平分割:把原來一個表拆分成多個表,每個表的結構都一樣,解決單表資料量大的問題。
4.5 分區
分區就是把一張表的資料分成多個區塊,這些區塊可以在一個磁碟上,也可以在不同的磁碟上,分區後,表面上還是一張表,但資料散列在多個位置,這樣一來,多塊硬碟同時處理不同的請求,從而提高磁碟I/O讀寫效能,實現比較簡單。
註:增加緩衝、分庫、分表和分區主要由程式猿來實現。
5、資料庫維護
資料庫維護是營運工程師或者DBA主要工作,包括效能監控、效能分析、效能調優、Database Backup和恢複等。
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 Database Backup
備份資料庫是最基本的工作,也是最重要的,否則後果很嚴重,你懂得!但由於資料庫比較大,上百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效能
#參數-P是顯示CPU數,ALL為所有,也可以只顯示第幾顆
#查看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等。資料存放區方面採用Distributed File System,如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. 使用Archive Storage引擎日誌表或審計表-這是更有效地寫道.
56. 會話資料存放區在緩衝(memcache)的而不是MySQL中 ? 緩衝允許自動自動填值的,並阻止您建立難以讀取和寫入到MySQL的時空資料.
57.儲存可變長度的字串時使用VARCHAR而不是CHAR ? 節省空間的,因為固定長度的CHAR,而VARCHAR長度不固定(UTF8不受此影響).
58. 逐步進行模式的變化 ? 一個小的變化,可以有巨大的影響.
59.在開發環境中測試所有模式,反映生產變化.
60. 不要隨意更改你的設定檔中的值,它可以產生災難性的影響.
61. 有時候,在MySQL的configs少即是多.
62.有疑問時使用一個通用的MySQL設定檔.
查詢最佳化:
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.