最近很火的MySQL:拋開復雜的架構設計,MySQL優化思想基本都在這

優化一覽圖

最近很火的MySQL:拋開復雜的架構設計,MySQL優化思想基本都在這

優化

最近很火的MySQL:拋開復雜的架構設計,MySQL優化思想基本都在這
筆者將優化分為了兩大類:軟優化和硬優化。軟優化一般是操作數據庫即可;而硬優化則是操作服務器硬件及參數設置。

1、軟優化

1)查詢語句優化

首先我們可以用EXPLAIN或DESCRIBE(簡寫:DESC)命令分析一條查詢語句的執行信息。

例:

DESC SELECT * FROM `user`

顯示:

最近很火的MySQL:拋開復雜的架構設計,MySQL優化思想基本都在這
其中會顯示索引和查詢數據讀取數據條數等信息。

2)優化子查詢

在MySQL中,盡量使用JOIN來代替子查詢。因為子查詢需要嵌套查詢,嵌套查詢時會建立一張臨時表,臨時表的建立和刪除都會有較大的系統開銷,而連接查詢不會創建臨時表,因此效率比嵌套子查詢高。

3)使用索引

索引是提高數據庫查詢速度最重要的方法之一,使用索引的三大注意事項包括:

  • LIKE關鍵字匹配'%'開頭的字符串,不會使用索引;
  • OR關鍵字的兩個字段必須都是用了索引,該查詢才會使用索引;
  • 使用多列索引必須滿足最左匹配。

4)分解表

對于字段較多的表,如果某些字段使用頻率較低,此時應當將其分離出來從而形成新的表。

5)中間表

對于將大量連接查詢的表可以創建中間表,從而減少在查詢時造成的連接耗時。

6)增加冗余字段

類似于創建中間表,增加冗余也是為了減少連接查詢。

7)分析表、檢查表、優化表

分析表主要是分析表中關鍵字的分布;檢查表主要是檢查表中是否存在錯誤;優化表主要是消除刪除或更新造成的表空間浪費。

分析表: 使用 ANALYZE 關鍵字,如ANALYZE TABLE user

最近很火的MySQL:拋開復雜的架構設計,MySQL優化思想基本都在這

  • Op: 表示執行的操作;
  • Msg_type: 信息類型,有status、info、note、warning、error;
  • Msg_text: 顯示信息。

檢查表: 使用 CHECK關鍵字,如CHECK TABLE user [option]。 option 只對MyISAM有效。共五個參數值:

  • QUICK: 不掃描行,不檢查錯誤的連接;
  • FAST: 只檢查沒有正確關閉的表;
  • CHANGED: 只檢查上次檢查后被更改的表和沒被正確關閉的表;
  • MEDIUM: 掃描行,以驗證被刪除的連接是有效的,也可以計算各行關鍵字校驗和;
  • EXTENDED: 最全面的的檢查,對每行關鍵字全面查找。

優化表: 使用OPTIMIZE關鍵字,如OPTIMIZE [LOCAL|NO_WRITE_TO_BINLOG] TABLE user;

LOCAL|NO_WRITE_TO_BINLOG都是表示不寫入日志,優化表只對VARCHAR、BLOB和TEXT有效,通過OPTIMIZE TABLE語句可以消除文件碎片,在執行過程中會加上只讀鎖。

2、硬優化

1)硬件三件套

  • 配置多核心和頻率高的cpu,多核心可以執行多個線程;
  • 配置大內存,提高內存,即可提高緩存區容量,因此能減少磁盤I/O時間,從而提高響應速度;
  • 配置高速磁盤或合理分布磁盤:高速磁盤提高I/O,分布磁盤能提高并行操作的能力。

2)優化數據庫參數

優化數據庫參數可以提高資源利用率,從而提高MySQL服務器性能。MySQL服務的配置參數都在my.cnf或my.ini,下面列出性能影響較大的幾個參數:

  • key_buffer_size: 索引緩沖區大小;
  • table_cache: 能同時打開表的個數;
  • query_cache_size和query_cache_type: 前者是查詢緩沖區大小,后者是前面參數的開關,0表示不使用緩沖區,1表示使用緩沖區,但可以在查詢中使用SQL_NO_CACHE表示不要使用緩沖區,2表示在查詢中明確指出使用緩沖區才用緩沖區,即SQL_CACHE;
  • sort_buffer_size: 排序緩沖區。

3)分庫分表

因為數據庫壓力過大,首先一個問題就是高峰期系統性能可能會降低,因為數據庫負載過高對性能會有影響。

另外一個,壓力過大把你的數據庫給搞掛了怎么辦?

所以此時你必須得對系統做分庫分表+讀寫分離,也就是把一個庫拆分為多個庫,部署在多個數據庫服務上,這時作為主庫承載寫入請求。然后每個主庫都掛載至少一個從庫,由從庫來承載讀請求。

最近很火的MySQL:拋開復雜的架構設計,MySQL優化思想基本都在這

4)緩存集群

如果用戶量越來越大,此時你可以不停的加機器,比如說系統層面不停加機器,就可以承載更高的并發請求。

然后數據庫層面如果寫入并發越來越高,就擴容加數據庫服務器,通過分庫分表是可以支持擴容機器的,如果數據庫層面的讀并發越來越高,就擴容加更多的從庫。

但是這里有一個很大的問題:

數據庫其實本身不是用來承載高并發請求的,所以通常來說,數據庫單機每秒承載的并發就在幾千的數量級,而且數據庫使用的機器都是比較高配置,比較昂貴的機器,成本很高。

如果你就是簡單的不停的加機器,其實是不對的。

所以在高并發架構里通常都有緩存這個環節,緩存系統的設計就是為了承載高并發而生。單機承載的并發量都在每秒幾萬,甚至每秒數十萬,對高并發的承載能力比數據庫系統要高出一到兩個數量級。

你完全可以根據系統的業務特性,對那種寫少讀多的請求,引入緩存集群。

具體來說,就是在寫數據庫的時候同時寫一份數據到緩存集群里,然后用緩存集群來承載大部分的讀請求。這樣的話,通過緩存集群,就可以用更少的機器資源承載更高的并發。

最近很火的MySQL:拋開復雜的架構設計,MySQL優化思想基本都在這

結語

最近很火的MySQL:拋開復雜的架構設計,MySQL優化思想基本都在這
一個完整而復雜的高并發系統架構中,一定會包含各種復雜的自研基礎架構系統和各種精妙的架構設計,因此一篇小文頂多具有拋磚引玉的效果。但是總得來看,數據庫優化的思想差不多就這些了。希望能對大家有所幫助。

轉載于:https://blog.51cto.com/13902811/2375603

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

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

相關文章

【讀書筆記】《深入淺出Webpack》

Webpack版本 分析版本為3.6.0 4.0為最近升級的版本,與之前版本變化較大,編譯輸出的文件與3.0版本會不一致,目前項目中使用的版本3.0版本,所以基于3.0版本進行分析學習。 Webpack構建流程 初始化:啟動構建,讀…

《JAVA與模式》之橋梁模式

在閻宏博士的《JAVA與模式》一書中開頭是這樣描述橋梁(Bridge)模式的: 橋梁模式是對象的結構模式。又稱為柄體(Handle and Body)模式或接口(Interface)模式。橋梁模式的用意是“將抽象化(Abstraction)與實現化(Implementation)脫耦&#xff0…

LABLEME UPDATE DAMOD

Labelme的改進——海量圖片的自動標注 深度學習一般需要對大量的圖片進行標注,但是手動標注耗時耗力,所以模仿labelme軟件的功能,使用程序對大批量的圖片進行自動標注,大大減少手動操作。下面介紹如何實現對大批量的圖片進行標…

Java基礎教程:面向對象編程[2]

Java基礎教程:面向對象編程[2] 內容大綱 訪問修飾符 四種訪問修飾符 Java中,可以使用訪問控制符來保護對類、變量、方法和構造方法的訪問。Java 支持 4 種不同的訪問權限。 default (即缺省,什么也不寫): 在同一包內可見&#xff…

【javascript】異步編年史,從“純回調”到Promise

異步和分塊——程序的分塊執行 一開始學習javascript的時候, 我對異步的概念一臉懵逼, 因為當時百度了很多文章,但很多各種文章不負責任的把籠統的描述混雜在一起,讓我對這個 JS中的重要概念難以理解, “異步是非阻塞的…

Shell編程之if語法練習(LNMP)全過程

大家好,我是延凱,本人原來在CSDN寫作已經快一年了 都是相關Linux運維這方面的技術知識,現在搬到博客園也是我一直想的,本博客主要寫Python,docker,shell等偏向開發云計算等知識點,謝謝各位&…

基于UNet和camvid數據集的道路分割

基于UNet和camvid數據集的道路分割h(1.3.0): 背景 語義分割是深度學習中的一個非常重要的研究方向,并且UNet是語義分割中一個非常經典的模型。在本次博客中,我嘗試用UNet對camvid dataset數據集進行道路分割,大致期望的效果如下&…

二分法查找和普通查找

一、普通查找 對于數組和一個需要查找的元素來說,普通查找的原理很簡單,即為從數組的第一個元素到最后一個元素進行遍歷,如果第i個元素的值等于我們需要查找的值,那么返回找到的角標i,否則返回-1表示沒有查找到。這里以…

Linux下安裝zookeeper集群(奇數個)

1、 解壓zookeeper壓縮包 2、 data里創建“myid”文件(命令touch myid),內容是1(命令 echo 1 >> myid) 3、 zoo.cnf里配置dataDir、clientport、server.nIP:端口1(2881):端…

立體標定

立體標定應用標定數據轉換成深度圖標定 由于攝像頭目前是我們手動進行定位的,我們現在還不知道兩張圖像與世界坐標之間的耦合關系,所以下一步要進行的是標定,用來確定分別獲取兩個攝像頭的內部參數,并且根據兩個攝像頭在同一個世…

if _name_ == _main_

1.作用 py文件有2種使用方法,第1是自己本腳本自己獨立執行;第2是被import到其他文件腳本中執行. if _name_ " _main_" 該語句控制其他下一步的腳本是否執行。如果是自己本腳本獨立執行,那就運行該if條件下的腳本;如果…

LLVM完整參考安裝

文章目錄 一、直接下載編譯好的,見圖片命令二、下載源代碼自己編譯安裝 下面提供下載并mv完全的文件包三、安裝LLVM編譯器一、直接下載編譯好的,見圖片命令 這里使用llvm官網編譯好的包, 直接解壓即可用LLVM下載官網點擊這里下載llvm-6.0.1 下載完成后解壓tar -vxf clangllv…

微軟正式釋出基于 Chromium 的 Edge 預覽版本

百度智能云域名服務,.com新用戶首購僅需25元 微軟基于 Chromium 的全新版本 Edge 一直吸引著開發者與用戶的目光,當地時間 8 日,官方終于釋出了第一個 Dev 和 Canary 頻道構建版本。 Dev 與 Canary build 都是開發者預覽版,同屬…

下載和安裝R、RStudio !

現如今,R語言是統計領域廣泛使用的工具,是屬于GNU系統的一個自由、免費、源代碼開放的軟件,是用于統計計算和統計繪圖的優秀工具。而RStudio是R的集成開發環境,用它進行R編程的學習和實踐會更加輕松和方便。下面就教大家如何下載并…

豆瓣首頁話題輸入框的實現

在做問答的時候,遇到一個需求,用戶的問題需要限制字數,不僅顯示計算的超出字數,還需在超出的內容上加一些提醒的效果,例如豆瓣首頁的話題輸入框,抽時間研究了下,需要考慮下面幾個問題&#xff1…

pytorch 吸煙檢測yolov5s

YOLOV5s 吸煙目標檢測 參考學習 文章目錄 本原創項目長期更新,旨在完成校園異常行為實時精檢測,作到集成N次開發優化(不止局限于調包)為止,近期將不斷更新如下模型數據標注文件教程。關注博主,Star 一下g…

JQuery的ajax函數執行失敗,alert函數彈框一閃而過

先查看<form>標簽是否有action屬性&#xff0c;如果沒有&#xff0c;并且最后<button>標簽的type屬性為submit‘時&#xff0c;默認提交位置就是當前頁面 如果在頁面右鍵檢查&#xff0c;點擊網絡&#xff0c;會在開頭發現這樣的post包&#xff1a; 在右側消息頭處…

C#中Request.ServerVariables詳細說明及代理

Request.ServerVariables("Url") 返回服務器地址Request.ServerVariables("Path_Info") 客戶端提供的路徑信息Request.ServerVariables("Appl_Physical_Path") 與應用程序元數據庫路徑相應的物理路徑Request.ServerVariables("Path_Transla…

coco與voc相互轉化

把LabelImg標注的YOLO格式標簽轉化為VOC格式標簽 和 把VOC格式標簽轉化為YOLO格式標簽 點亮&#xff5e;黑夜 2020-07-07 11:08:24 3537 已收藏 90 分類專欄&#xff1a; 19—目標檢測 文章標簽&#xff1a; voc yolo 版權 把LabelImg標注的YOLO格式標簽轉化為VOC格式標簽 和…

angular中封裝fancyBox(圖片預覽)

首先在官網下載最新版的fancyBox(一定要去最新網站&#xff0c;以前依賴的jquery版本偏低)&#xff0c;附上鏈接&#xff1a;http://fancyapps.com/fancybox/3/ 然后在項目中引用jquery&#xff0c;然后在引用jquery.fancybox.min.css和jquery.fancybox.min.js。 如果需要動畫和…