吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

你會從哪些維度進行MySQL性能優化?1

jf_78858299 ? 來源:蟬沐風的碼場 ? 作者:蟬沐風 ? 2023-03-03 10:23 ? 次閱讀

你會從哪些維度進行MySQL性能優化?你會怎么回答?

所謂的性能優化,一般針對的是MySQL查詢的優化。既然是優化查詢,我們自然要先知道查詢操作要經過哪些環節,然后思考可以在哪些環節進行優化。

下面從5個角度介紹一下MySQL優化的一些策略。

圖片

image-20220405204100602

1. 連接配置優化

處理連接是MySQL客戶端和MySQL服務端親熱的第一步,第一步都邁不好,也就別談后來的故事了。

既然連接是雙方的事情,我們自然從服務端和客戶端兩個方面來進行優化嘍。

1.1 服務端配置

服務端需要做的就是盡可能地多接受客戶端的連接,或許你遇到過error 1040: Too many connections的錯誤?就是服務端的胸懷不夠寬廣導致的,格局太小!

我們可以從兩個方面解決連接數不夠的問題:

  1. 增加可用連接數,修改環境變量max_connections,默認情況下服務端的最大連接數為151
mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 151   |
+-----------------+-------+
1 row in set (0.01 sec)
  1. 及時釋放不活動的連接,系統默認的客戶端超時時間是28800秒(8小時),我們可以把這個值調小一點
mysql> show variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 28800 |
+---------------+-------+
1 row in set (0.01 sec)

MySQL有非常多的配置參數,并且大部分參數都提供了默認值,默認值是MySQL作者經過精心設計的,完全可以滿足大部分情況的需求,不建議在不清楚參數含義的情況下貿然修改。

1.2 客戶端優化

客戶端能做的就是盡量減少和服務端建立連接的次數,已經建立的連接能湊合用就湊合用,別每次執行個SQL語句都創建個新連接,服務端和客戶端的資源都吃不消啊。

解決的方案就是使用連接池來復用連接。

常見的數據庫連接池有DBCPC3P0、阿里的DruidHikari,前兩者用得很少了,后兩者目前如日中天。

但是需要注意的是連接池并不是越大越好,比如Druid的默認最大連接池大小是8,Hikari默認最大連接池大小是10,盲目地加大連接池的大小,系統執行效率反而有可能降低。為什么?

對于每一個連接,服務端會創建一個單獨的線程去處理,連接數越多,服務端創建的線程自然也就越多。而線程數超過CPU個數的情況下,CPU勢必要通過分配時間片的方式進行線程的上下文切換,頻繁的上下文切換會造成很大的性能開銷。

Hikari官方給出了一個PostgreSQL數據庫連接池大小的建議值公式,CPU核心數*2+1。假設服務器的CPU核心數是4,把連接池設置成9就可以了。這種公式在一定程度上對其他數據庫也是適用的,大家面試的時候可以吹一吹。

2. 架構優化

2.1 使用緩存

系統中難免會出現一些比較慢的查詢,這些查詢要么是數據量大,要么是查詢復雜(關聯的表多或者是計算復雜),使得查詢會長時間占用連接。

如果這種數據的實效性不是特別強(不是每時每刻都會變化,例如每日報表),我們可以把此類數據放入緩存系統中,在數據的緩存有效期內,直接從緩存系統中獲取數據,這樣就可以減輕數據庫的壓力并提升查詢效率。

圖片

緩存的使用

2.2 讀寫分離(集群、主從復制)

項目的初期,數據庫通常都是運行在一臺服務器上的,用戶的所有讀寫請求會直接作用到這臺數據庫服務器,單臺服務器承擔的并發量畢竟是有限的。

針對這個問題,我們可以同時使用多臺數據庫服務器,將其中一臺設置為為小組長,稱之為master節點,其余節點作為組員,叫做slave。用戶寫數據只往master節點寫,而讀的請求分攤到各個slave節點上。這個方案叫做 讀寫分離 。給組長加上組員組成的小團體起個名字,叫 集群

圖片

這就是集群

注:很多開發者不滿master-slave這種具有侵犯性的詞匯(因為他們認為會聯想到種族歧視、黑人奴隸等),所以發起了一項更名運動。

受此影響MySQL也會逐漸停用masterslave等術語,轉而用sourcereplica替代,大家碰到的時候明白即可。

使用集群必然面臨一個問題,就是多個節點之間怎么保持數據的一致性。畢竟寫請求只往master節點上發送了,只有master節點的數據是最新數據,怎么把對master節點的寫操作也同步到各個slave節點上呢?

主從復制技術來了!我在一條SQL更新語句是如何執行的?中粗淺地介紹了一下binlog日志,我直接搬過來了。

binlog是實現MySQL主從復制功能的核心組件。master節點會將所有的寫操作記錄到binlog中,slave節點會有專門的I/O線程讀取master節點的binlog,將寫操作同步到當前所在的slave節點。

圖片

主從復制

這種集群的架構對減輕主數據庫服務器的壓力有非常好的效果,但是隨著業務數據越來越多,如果某張表的數據量急劇增加,單表的查詢性能就會大幅下降,而這個問題是讀寫分離也無法解決的,畢竟所有節點存放的是一模一樣的數據啊,單表查詢性能差,說的自然也是所有節點性能都差。

這時我們可以把單個節點的數據分散到多個節點上進行存儲,這就是 分庫分表

2.3 分庫分表

分庫分表中的節點的含義比較寬泛,要是把數據庫作為節點,那就是分庫;如果把單張表作為節點,那就是分表。

大家都知道分庫分表分成垂直分庫、垂直分表、水平分庫和水平分表,但是每次都記不住這些概念,我就給大家詳細說一說,幫助大家理解。

2.3.1 垂直分庫

圖片

垂直分庫

在單體數據庫的基礎上垂直切幾刀,按照業務邏輯拆分成不同的數據庫,這就是垂直分庫啦。

圖片

垂直分庫

2.3.2 垂直分表

圖片

垂直分表

垂直分表就是在單表的基礎上垂直切一刀(或幾刀),將一個表的多個字短拆成若干個小表,這種操作需要根據具體業務來進行判斷,通常會把經常使用的字段(熱字段)分成一個表,不經常使用或者不立即使用的字段(冷字段)分成一個表,提升查詢速度。

圖片

垂直分表

拿上圖舉例:通常情況下商品的詳情信息都比較長,而且查看商品列表時往往不需要立即展示商品詳情(一般都是點擊詳情按鈕才會進行顯示),而是會將商品更重要的信息(價格等)展示出來,按照這個業務邏輯,我們將原來的商品表做了垂直分表。

2.3.3 水平分表

把單張表的數據按照一定的規則(行話叫分片規則)保存到多個數據表上,橫著給數據表來一刀(或幾刀),就是水平分表了。

圖片

水平分表

圖片

水平分表

2.3.4 水平分庫

水平分庫就是對單個數據庫水平切一刀,往往伴隨著水平分表。

圖片

水平分庫

圖片

水平分庫

2.3.5 總結

水平分,主要是為了解決存儲的瓶頸;垂直分,主要是為了減輕并發壓力。

2.4 消息隊列削峰

通常情況下,用戶的請求會直接訪問數據庫,如果同一時刻在線用戶數量非常龐大,極有可能壓垮數據庫(參考明星出軌或公布戀情時微博的狀態)。

這種情況下可以通過使用消息隊列降低數據庫的壓力,不管同時有多少個用戶請求,先存入消息隊列,然后系統有條不紊地從消息隊列中消費請求。

圖片

隊列削峰

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    7139

    瀏覽量

    89574
  • 服務器
    +關注

    關注

    12

    文章

    9303

    瀏覽量

    86061
  • MySQL
    +關注

    關注

    1

    文章

    829

    瀏覽量

    26742
  • 服務端
    +關注

    關注

    0

    文章

    66

    瀏覽量

    7056
收藏 人收藏

    評論

    相關推薦

    MySQL的執行過程 SQL語句性能優化常用策略

    回顧 MySQL 的執行過程,幫助介紹如何進行 sql 優化
    的頭像 發表于 12-12 10:26 ?714次閱讀
    <b class='flag-5'>MySQL</b>的執行過程 SQL語句<b class='flag-5'>性能</b><b class='flag-5'>優化</b>常用策略

    MySQL性能優化淺析及線上案例

    作者:京東健康 孟飛 1、 數據庫性能優化的意義 業務發展初期,數據庫中量一般都不高,也不太容易出一些性能問題或者出的問題也不大,但是當數據庫的量級達到一定規模之后,如果缺失有效的預警
    的頭像 發表于 10-22 15:17 ?742次閱讀
    <b class='flag-5'>MySQL</b><b class='flag-5'>性能</b><b class='flag-5'>優化</b>淺析及線上案例

    mysql的查詢優化

    mysql查詢優化
    發表于 03-12 11:06

    MySQL優化之查詢性能優化之查詢優化器的局限性與提示

    MySQL優化三:查詢性能優化之查詢優化器的局限性與提示
    發表于 06-02 06:34

    MySQL索引使用優化和規范

    MySQL - 索引使用優化和規范
    發表于 06-15 16:01

    MySql5.6性能優化最佳實踐

    MySql5.6性能優化最佳實踐
    發表于 09-08 08:47 ?13次下載
    <b class='flag-5'>MySql</b>5.6<b class='flag-5'>性能</b><b class='flag-5'>優化</b>最佳實踐

    幫助優化MySQL數據庫性能的7個技巧

    隨著尺寸和負載的增長,MySQL性能趨于下降。記住這些訣竅,便可保持MySQL的流暢運行。 測量應用程序的方法之一是看性能。而
    發表于 11-30 15:03 ?805次閱讀
    幫助<b class='flag-5'>優化</b><b class='flag-5'>MySQL</b>數據庫<b class='flag-5'>性能</b>的7個技巧

    詳解MySQL的查詢優化 MySQL邏輯架構分析

    說起MySQL的查詢優化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *、不使用NULL字段、合理創建索引、為字段選擇合適的數據類型..... 是否真的理解這些優化技巧?是否理
    的頭像 發表于 05-28 16:43 ?4391次閱讀
    詳解<b class='flag-5'>MySQL</b>的查詢<b class='flag-5'>優化</b> <b class='flag-5'>MySQL</b>邏輯架構分析

    MySQL數據庫:理解MySQL性能優化優化查詢

    最近一直在為大家更新MySQL相關學習內容,可能有朋友不懂MySQL的重要性。在程序,語言,架構更新換代頻繁的今天,MySQL 恐怕是大家使用最多的存儲數據庫了。由于MySQL
    的頭像 發表于 07-02 17:18 ?3149次閱讀
    <b class='flag-5'>MySQL</b>數據庫:理解<b class='flag-5'>MySQL</b>的<b class='flag-5'>性能</b><b class='flag-5'>優化</b>、<b class='flag-5'>優化</b>查詢

    MySQL索引的使用問題

    一、前言 在MySQL進行SQL優化的時候,經常會在一些情況下,對MySQL能否利用索引有一些迷惑。譬如:1
    的頭像 發表于 01-06 16:13 ?1640次閱讀

    利用MySQL進行一主一的主從復制

    本文講述了如何使用MyBatisPlus+ShardingSphereJDBC進行讀寫分離,以及利用MySQL進行一主一的主從復制。
    的頭像 發表于 07-28 09:47 ?1087次閱讀

    哪些維度進行MySQL性能優化?2

    哪些維度進行MySQL性能
    的頭像 發表于 03-03 10:23 ?539次閱讀
    <b class='flag-5'>你</b><b class='flag-5'>會</b><b class='flag-5'>從</b>哪些<b class='flag-5'>維度</b><b class='flag-5'>進行</b><b class='flag-5'>MySQL</b><b class='flag-5'>性能</b><b class='flag-5'>優化</b>?2

    如何將數據MySQL遷移到Influxdb中

    如果以前是將時序數據存放在MySQL,現在為了獲取更好的性能和使用可視化工具,我們需要將數據MySQL遷移到Influxdb中。 這看起來是一個常見場景,經過一番查閱,發現了
    的頭像 發表于 11-02 10:54 ?1307次閱讀

    MySQL性能優化方法

    MySQL 性能優化是一項關鍵的任務,可以提高數據庫的運行速度和效率。以下是一些優化方法,包括具體代碼和詳細優化方案。
    的頭像 發表于 11-22 09:59 ?664次閱讀

    MySQL執行過程:如何進行sql 優化

    1)客戶端發送一條查詢語句到服務器; (2)服務器先查詢緩存,如果命中緩存,則立即返回存儲在緩存中的數據; (3)未命中緩存后,MySQL 通過關鍵字將 SQL 語句進行解析,并生成一顆對應的解析樹,
    的頭像 發表于 12-12 10:19 ?450次閱讀
    <b class='flag-5'>MySQL</b>執行過程:如何<b class='flag-5'>進行</b>sql <b class='flag-5'>優化</b>
    澳盈88娱乐城| 百家乐棋牌官网| 金樽百家乐的玩法技巧和规则 | 风水24山那个排第一| 百家乐赢钱秘籍鹰| 叶城县| 百家乐官网智能投注系统| 百家乐免费是玩| 凯旋门娱乐城开户| 属狗与属猪能做生意吗| 海立方百利宫娱乐城| 百家乐桌台布| 在线百家乐官网| 广州百家乐扫描分析| 百家乐官网庄闲的概率| 百家乐23珠路打法| 线上百家乐官网攻略| 免费百家乐计划工具| 哪个百家乐官网投注好| 金域百家乐的玩法技巧和规则 | 大发888充值卡| 圣安娜百家乐官网包杀合作| 北京太阳城老年公寓| 百家乐官网的看路技巧| 大发888城| 百家乐10个人| 博彩百家乐官网规则| 大发888娱乐城casinolm0| 九宫飞星2024年的财位| 大亨百家乐官网娱乐城| 百家乐论坛| 百家乐官网平一直压庄| 莱西市| 网站百家乐博彩| 网络百家乐官网可靠吗| 大发888 客服| 百家乐官网真人现场| 百家乐官网经验之谈| 威尼斯人娱乐场 28| 太阳城百家乐投注| 历史百家乐官网路单图|