比較全面的MySQL優化參考
本文整理了一些MySQL的通用優化方法,做個簡單的總結分享,旨在幫助那些沒有專職MySQL DBA的企業做好基本的優化工作,至於具體的SQL優化,大部分透過加適當的索引即可達到效果,更複雜的就需要具體分析了。
1、硬體層相關最佳化
1.1、CPU相關
在伺服器的BIOS設定中,可調整下面的幾個配置,目的是發揮CPU最大性能,或避免經典的NUMA問題:
1、選擇Performance Per Watt Optimized(DAPC)模式,發揮CPU最大性能,跑DB這種通常需要高運算量的服務就不要考慮節電了;
2、關閉C1E和C States等選項,目的也是為了提升CPU效率;
3、Memory Frequency(記憶體頻率)選擇Maximum Performance (最佳效能);
4、記憶體設定選單中,啟用Node Interleaving,避免NUMA問題;
1.2、磁碟I/O相關
下面幾個是依照IOPS效能提升的幅度排序,對於磁碟I/O可最佳化的一些措施:
1、使用SSD或PCIe SSD設備,至少獲得數百倍甚至萬倍的IOPS提升;
2、購置陣列卡同時配備CACHE及BBU模組,可明顯提升IOPS(主要指機械盤,SSD或PCIe SSD除外。同時需定期檢查CACHE及BBU模組的健康狀況,確保意外時不至於遺失數據);
3、有陣列卡時,設定陣列寫策略為WB,甚至FORCE WB(若有雙電保護,或對資料安全性要求不是特別高的話),嚴禁使用WT策略。且閉陣列預讀策略,基本上是雞肋,用處不大;
4、盡可能選用RAID-10,而非RAID-5;
5、使用機械盤的話,盡可能選擇高轉速的,例如選用15KRPM,而不是7.2KRPM的盤,不差幾個錢的;
2、系統層相關優化
2.1、檔案系統層優化
在檔案系統層,下面幾個措施可明顯提升IOPS效能:
1、使用deadline/noop這兩種I/O調度器,千萬別用cfq(它不適合跑DB類別服務);
2、使用xfs檔案系統,千萬別用ext3;ext4勉強可用,但業務量很大的話,則一定要用xfs;
3、檔案系統mount參數中增加:noatime, nodiratime, nobarrier幾個選項(nobarrier是xfs檔案系統特有的);
2.2、其他核心參數最佳化
針對關鍵核心參數設定合適的值,目的是為了減少swap的傾向,並且讓記憶體和磁碟I/O不會大幅波動,導致瞬間波峰負載:
1、將vm.swappiness設定為5-10左右即可,甚至設定為0(RHEL 7以上則慎重設定為0,除非你允許OOM kill發生),以降低使用SWAP的機會;
2、將vm.dirty_background_ratio設定為5-10,將vm .dirty_ratio設定為它的兩倍左右,以確保能持續將髒資料刷新到磁碟,避免瞬間I/O寫,產生嚴重等待(和MySQL中的innodb_max_dirty_pages_pct類似);
# 3、將net .ipv4.tcp_tw_recycle、net.ipv4.tcp_tw_reuse都設定為1,減少TIME_WAIT,提高TCP效率;
4、至於網傳的read_ahead_kb、nr_requests這兩個參數,我經過測試後,發現對讀寫混合為主的OLTP環境影響並不大(應該是對讀取敏感的場景更有效果),不過沒準是我測試方法有問題,可自行斟酌是否調整;
3、MySQL層相關優化
3.1、關於版本選擇
官方版本我們稱為ORACLE MySQL,這個沒什麼好說的,相信絕大多數人會選擇它。
我個人強烈建議選擇Percona分支版本,它是一個相對比較成熟的、優秀的MySQL分支版本,在性能提升、可靠性、管理型方面做了不少改善。它和官方ORACLE MySQL版本基本上完全相容,而且效能大約有20%以上的提升,因此我優先推薦它,我自己也從2008年一直以它為主。
另一個重要的分支版本是MariaDB,說MariaDB是分支版本其實已經不太適合了,因為它的目標是取代ORACLE MySQL。它主要在原來的MySQL Server層做了大量的源碼級改進,也是一個非常可靠的、優秀的分支版本。但也由此產生了以GTID為代表的和官方版本無法相容的新特性(MySQL 5.7開始,也支援GTID模式線上動態開啟或關閉了),也考慮到絕大多數人還是會跟著官方版本走,因此沒優先推薦MariaDB。
3.2、關於最重要的參數選項調整建議
建議調整下面幾個關鍵參數以獲得較好的性能(可使用本站提供的my.cnf生成器生成配置文件模板):
1、選擇Percona或MariaDB版本的話,強烈建議啟用thread pool特性,可使得在高並發的情況下,效能不會發生大幅下降。此外,還有extra_port功能,非常實用, 關鍵時刻能救命的。還有另一個重要特色是QUERY_RESPONSE_TIME 功能,也能讓我們對整體的SQL回應時間分佈有直覺感受;
2、設定default-storage-engine=InnoDB,也就是預設採用InnoDB引擎,強烈強烈建議不要再使用MyISAM引擎了,InnoDB引擎絕對可以滿足99%以上的業務場景;
# 3、調整innodb_buffer_pool_size大小,如果是單實例且絕大多數是InnoDB引擎表的話,可考慮設定為實體記憶體的50% ~ 70%左右;
4、依實際需求設定innodb_flush_log_at_trx_commit、sync_binlog的值。如果要求資料不能遺失,那麼兩個都設為1。若允許遺失一點數據,則可分別設為2和10。而如果完全不用care資料是否遺失的話(例如在slave上,反正大不了重做一次),則可都設為0。這三種設定值導致資料庫的效能受到影響程度分別是:高、中、低,也就是第一個會另資料庫最慢,最後一個則相反;
5、設定innodb_file_per_table = 1,使用獨立表空間,我實在是想不出來用共享表空間有什麼好處了;
6、設定innodb_data_file_path = ibdata1:1G:autoextend,千萬不要用預設的10M,否則在有高並發交易時,會受到不小的影響;
7、設定innodb_log_file_size=256M,設定innodb_log_files_in_group=2,基本上可滿足90%以上的場景;
8、設定long_query_time = 1111而在5.5版本以上,已經可以設定為小於1了,建議設定為0.05(50毫秒),記錄那些執行較慢的SQL,用於後續的分析排查;
9、根據業務實際需要,適當調整max_connection(最大連接數)、max_connection_error(最大錯誤數,建議設定為10萬以上,而open_files_limit、innodb_open_files、table_open_cache、table_definition_cache這幾個參數則可設為約10倍於max_connection的大小;
## 10、常見的誤解是把tmp_table_size和max_heap_table_size設定的比較大,曾經見過設定為1G的,這2個選項是每個連線會話都會分配的,因此不要設定過大,否則容易導致OOM發生;其他的一些連接會話級選項例如:sort_buffer_size、join_buffer_size、read_buffer_size、read_rnd_buffer_size等,也需要注意不能設定過大; 11、由於已經建議不再使用MyISAMuffer_了,因此可以把引擎設定為32M左右,並且強烈建議關閉query cache功能; 3.3、關於Schema設計規範及SQL使用建議 下面列舉了幾個常見有助於提升MySQL效率的Schema設計規範及SQL使用建議: 1、所有的InnoDB表都設計一個無業務用途的自增列做主鍵,對於絕大多數場景都是如此,真正純只讀用InnoDB表的並不多,真如此的話還不如用TokuDB來得划算; 2、字段長度滿足需求前提下,盡可能選擇長度小的。此外,字段屬性盡量加上NOT NULL約束,可一定程度提高性能; 3、盡可能不使用TEXT/BLOB類型,確實需要的話,建議拆分到子表中,不要和主表格放在一起,避免SELECT * 的時候讀性能太差。 4、讀取資料時,只選取所需的列,不要每次都SELECT *,避免產生嚴重的隨機讀取問題,尤其是讀到一些TEXT/BLOB列; # 5、對一個VARCHAR(N)欄位建立索引時,通常取其50%(甚至更小)左右長度建立前綴索引就足以滿足80%以上的查詢需求了,沒必要建立整列的全長度索引; 6、通常情況下,子查詢的效能比較差,建議改造成JOIN寫法; 7、多表聯接查詢時,關聯字段類型盡量一致,並且都要有索引; 8、多表連接查詢時,把結果集小的表(注意,這裡是指過濾後的結果集,不一定是全表資料量小的)當作驅動表; 9、多表聯接且有排序時,排序欄位必須是驅動表裡的,否則排序列無法用到索引; 10、多用複合索引,少用多個獨立索引,尤其是有些基數(Cardinality)太小(比方說,該列的唯一值總數少於255)的欄位就不要建立獨立索引了; 11、類似分頁功能的SQL,建議先用主鍵關聯,然後回傳結果集,效率會高很多; 3.4、其他建議 關於MySQL的管理維護的其他建議有:# 1、通常地,單表物理大小不超過10GB,單表行數不超過1億條,行平均長度不超過8KB,如果機器性能足夠,這些數據量MySQL是完全能處理的過來的,不用擔心性能問題,這麼建議主要是考慮ONLINE DDL的代價較高;2、不用太擔心mysqld進程佔用太多內存,只要不發生OOM kill和用到大量的SWAP都還好;
3、在以往,單機上跑多實例的目的是能最大化利用運算資源,如果單一實例已經能耗盡大部分運算資源的話,就沒必要再跑多實例了;
4、定期使用pt-duplicate-key-checker檢查並刪除重複的索引。定期使用pt-index-usage工具檢查並刪除使用頻率很低的索引;
5、定期採集slow query log,用pt-query-digest工具進行分析,可結合Anemometer系統進行slow query管理以便分析slow query並進行後續優化工作;
6、可使用pt-kill殺掉超長時間的SQL請求,Percona版本中有個選項innodb_kill_idle_transaction 也可實現該功能;
##SQL請求# 7、使用pt-online-schema-change來完成大表的ONLINE DDL需求; 8、定期使用pt-table-checksum、pt-table-sync來檢查並修復mysql主從複製的資料差異; 寫在最後:這次的最佳化參考,大部分情況下我都介紹了適用的場景,如果你的應用場景和本文描述的不太一樣,那麼建議根據實際情況進行調整,而不是生搬硬套。歡迎質疑拍磚,但拒絕不經過大腦的習慣性抵制。 以上就是比較全面的MySQL優化參考的內容,更多相關內容請關注PHP中文網(www.php.cn)!
熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Laravel 是一款 PHP 框架,用於輕鬆構建 Web 應用程序。它提供一系列強大的功能,包括:安裝: 使用 Composer 全局安裝 Laravel CLI,並在項目目錄中創建應用程序。路由: 在 routes/web.php 中定義 URL 和處理函數之間的關係。視圖: 在 resources/views 中創建視圖以呈現應用程序的界面。數據庫集成: 提供與 MySQL 等數據庫的開箱即用集成,並使用遷移來創建和修改表。模型和控制器: 模型表示數據庫實體,控制器處理 HTTP 請求。

MySQL和phpMyAdmin是強大的數據庫管理工具。 1)MySQL用於創建數據庫和表、執行DML和SQL查詢。 2)phpMyAdmin提供直觀界面進行數據庫管理、表結構管理、數據操作和用戶權限管理。

MySQL与其他编程语言相比,主要用于存储和管理数据,而其他语言如Python、Java、C 则用于逻辑处理和应用开发。MySQL以其高性能、可扩展性和跨平台支持著称,适合数据管理需求,而其他语言在各自领域如数据分析、企业应用和系统编程中各有优势。

文章摘要:本文提供了詳細分步說明,指導讀者如何輕鬆安裝 Laravel 框架。 Laravel 是一個功能強大的 PHP 框架,它 упростил 和加快了 web 應用程序的開發過程。本教程涵蓋了從系統要求到配置數據庫和設置路由等各個方面的安裝過程。通過遵循這些步驟,讀者可以快速高效地為他們的 Laravel 項目打下堅實的基礎。

在MySQL中,外鍵的作用是建立表與表之間的關係,確保數據的一致性和完整性。外鍵通過引用完整性檢查和級聯操作維護數據的有效性,使用時需注意性能優化和避免常見錯誤。

MySQL和MariaDB的主要區別在於性能、功能和許可證:1.MySQL由Oracle開發,MariaDB是其分支。 2.MariaDB在高負載環境中性能可能更好。 3.MariaDB提供了更多的存儲引擎和功能。 4.MySQL採用雙重許可證,MariaDB完全開源。選擇時應考慮現有基礎設施、性能需求、功能需求和許可證成本。

MySQL和phpMyAdmin可以通過以下步驟進行有效管理:1.創建和刪除數據庫:在phpMyAdmin中點擊幾下即可完成。 2.管理表:可以創建表、修改結構、添加索引。 3.數據操作:支持插入、更新、刪除數據和執行SQL查詢。 4.導入導出數據:支持SQL、CSV、XML等格式。 5.優化和監控:使用OPTIMIZETABLE命令優化表,並利用查詢分析器和監控工具解決性能問題。

文章首段摘要:在選擇開發 Yi 框架應用程序的軟件時,需要考慮多個因素。雖然原生移動應用程序開發工具(如 XCode 和 Android Studio)可以提供強大的控制和靈活性,但跨平台框架(如 React Native 和 Flutter)憑藉其編寫一次,即可部署到多個平台的優點而越來越受歡迎。對於剛接觸移動開發的開發者,低代碼或無代碼平台(如 AppSheet 和 Glide)可以快速輕鬆地構建應用程序。另外,雲服務提供商(如 AWS Amplify 和 Firebase)提供了全面的工具
