RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

你會(huì)從哪些維度進(jìn)行MySQL性能優(yōu)化?1

jf_78858299 ? 來(lái)源:蟬沐風(fēng)的碼場(chǎng) ? 作者:蟬沐風(fēng) ? 2023-03-03 10:23 ? 次閱讀

你會(huì)從哪些維度進(jìn)行MySQL性能優(yōu)化?你會(huì)怎么回答?

所謂的性能優(yōu)化,一般針對(duì)的是MySQL查詢的優(yōu)化。既然是優(yōu)化查詢,我們自然要先知道查詢操作要經(jīng)過(guò)哪些環(huán)節(jié),然后思考可以在哪些環(huán)節(jié)進(jìn)行優(yōu)化。

下面從5個(gè)角度介紹一下MySQL優(yōu)化的一些策略。

圖片

image-20220405204100602

1. 連接配置優(yōu)化

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

既然連接是雙方的事情,我們自然從服務(wù)端和客戶端兩個(gè)方面來(lái)進(jìn)行優(yōu)化嘍。

1.1 服務(wù)端配置

服務(wù)端需要做的就是盡可能地多接受客戶端的連接,或許你遇到過(guò)error 1040: Too many connections的錯(cuò)誤?就是服務(wù)端的胸懷不夠?qū)拸V導(dǎo)致的,格局太??!

我們可以從兩個(gè)方面解決連接數(shù)不夠的問(wèn)題:

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

MySQL有非常多的配置參數(shù),并且大部分參數(shù)都提供了默認(rèn)值,默認(rèn)值是MySQL作者經(jīng)過(guò)精心設(shè)計(jì)的,完全可以滿足大部分情況的需求,不建議在不清楚參數(shù)含義的情況下貿(mào)然修改。

1.2 客戶端優(yōu)化

客戶端能做的就是盡量減少和服務(wù)端建立連接的次數(shù),已經(jīng)建立的連接能湊合用就湊合用,別每次執(zhí)行個(gè)SQL語(yǔ)句都創(chuàng)建個(gè)新連接,服務(wù)端和客戶端的資源都吃不消啊。

解決的方案就是使用連接池來(lái)復(fù)用連接。

常見(jiàn)的數(shù)據(jù)庫(kù)連接池有DBCP、C3P0、阿里的DruidHikari,前兩者用得很少了,后兩者目前如日中天。

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

對(duì)于每一個(gè)連接,服務(wù)端會(huì)創(chuàng)建一個(gè)單獨(dú)的線程去處理,連接數(shù)越多,服務(wù)端創(chuàng)建的線程自然也就越多。而線程數(shù)超過(guò)CPU個(gè)數(shù)的情況下,CPU勢(shì)必要通過(guò)分配時(shí)間片的方式進(jìn)行線程的上下文切換,頻繁的上下文切換會(huì)造成很大的性能開(kāi)銷。

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

2. 架構(gòu)優(yōu)化

2.1 使用緩存

系統(tǒng)中難免會(huì)出現(xiàn)一些比較慢的查詢,這些查詢要么是數(shù)據(jù)量大,要么是查詢復(fù)雜(關(guān)聯(lián)的表多或者是計(jì)算復(fù)雜),使得查詢會(huì)長(zhǎng)時(shí)間占用連接。

如果這種數(shù)據(jù)的實(shí)效性不是特別強(qiáng)(不是每時(shí)每刻都會(huì)變化,例如每日?qǐng)?bào)表),我們可以把此類數(shù)據(jù)放入緩存系統(tǒng)中,在數(shù)據(jù)的緩存有效期內(nèi),直接從緩存系統(tǒng)中獲取數(shù)據(jù),這樣就可以減輕數(shù)據(jù)庫(kù)的壓力并提升查詢效率。

圖片

緩存的使用

2.2 讀寫(xiě)分離(集群、主從復(fù)制)

項(xiàng)目的初期,數(shù)據(jù)庫(kù)通常都是運(yùn)行在一臺(tái)服務(wù)器上的,用戶的所有讀寫(xiě)請(qǐng)求會(huì)直接作用到這臺(tái)數(shù)據(jù)庫(kù)服務(wù)器,單臺(tái)服務(wù)器承擔(dān)的并發(fā)量畢竟是有限的。

針對(duì)這個(gè)問(wèn)題,我們可以同時(shí)使用多臺(tái)數(shù)據(jù)庫(kù)服務(wù)器,將其中一臺(tái)設(shè)置為為小組長(zhǎng),稱之為master節(jié)點(diǎn),其余節(jié)點(diǎn)作為組員,叫做slave。用戶寫(xiě)數(shù)據(jù)只往master節(jié)點(diǎn)寫(xiě),而讀的請(qǐng)求分?jǐn)偟礁鱾€(gè)slave節(jié)點(diǎn)上。這個(gè)方案叫做 讀寫(xiě)分離 。給組長(zhǎng)加上組員組成的小團(tuán)體起個(gè)名字,叫 集群

圖片

這就是集群

注:很多開(kāi)發(fā)者不滿master-slave這種具有侵犯性的詞匯(因?yàn)樗麄冋J(rèn)為會(huì)聯(lián)想到種族歧視、黑人奴隸等),所以發(fā)起了一項(xiàng)更名運(yùn)動(dòng)。

受此影響MySQL也會(huì)逐漸停用master、slave等術(shù)語(yǔ),轉(zhuǎn)而用sourcereplica替代,大家碰到的時(shí)候明白即可。

使用集群必然面臨一個(gè)問(wèn)題,就是多個(gè)節(jié)點(diǎn)之間怎么保持?jǐn)?shù)據(jù)的一致性。畢竟寫(xiě)請(qǐng)求只往master節(jié)點(diǎn)上發(fā)送了,只有master節(jié)點(diǎn)的數(shù)據(jù)是最新數(shù)據(jù),怎么把對(duì)master節(jié)點(diǎn)的寫(xiě)操作也同步到各個(gè)slave節(jié)點(diǎn)上呢?

主從復(fù)制技術(shù)來(lái)了!我在一條SQL更新語(yǔ)句是如何執(zhí)行的?中粗淺地介紹了一下binlog日志,我直接搬過(guò)來(lái)了。

binlog是實(shí)現(xiàn)MySQL主從復(fù)制功能的核心組件。master節(jié)點(diǎn)會(huì)將所有的寫(xiě)操作記錄到binlog中,slave節(jié)點(diǎn)會(huì)有專門的I/O線程讀取master節(jié)點(diǎn)的binlog,將寫(xiě)操作同步到當(dāng)前所在的slave節(jié)點(diǎn)。

圖片

主從復(fù)制

這種集群的架構(gòu)對(duì)減輕主數(shù)據(jù)庫(kù)服務(wù)器的壓力有非常好的效果,但是隨著業(yè)務(wù)數(shù)據(jù)越來(lái)越多,如果某張表的數(shù)據(jù)量急劇增加,單表的查詢性能就會(huì)大幅下降,而這個(gè)問(wèn)題是讀寫(xiě)分離也無(wú)法解決的,畢竟所有節(jié)點(diǎn)存放的是一模一樣的數(shù)據(jù)啊,單表查詢性能差,說(shuō)的自然也是所有節(jié)點(diǎn)性能都差。

這時(shí)我們可以把單個(gè)節(jié)點(diǎn)的數(shù)據(jù)分散到多個(gè)節(jié)點(diǎn)上進(jìn)行存儲(chǔ),這就是 分庫(kù)分表

2.3 分庫(kù)分表

分庫(kù)分表中的節(jié)點(diǎn)的含義比較寬泛,要是把數(shù)據(jù)庫(kù)作為節(jié)點(diǎn),那就是分庫(kù);如果把單張表作為節(jié)點(diǎn),那就是分表。

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

2.3.1 垂直分庫(kù)

圖片

垂直分庫(kù)

在單體數(shù)據(jù)庫(kù)的基礎(chǔ)上垂直切幾刀,按照業(yè)務(wù)邏輯拆分成不同的數(shù)據(jù)庫(kù),這就是垂直分庫(kù)啦。

圖片

垂直分庫(kù)

2.3.2 垂直分表

圖片

垂直分表

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

圖片

垂直分表

拿上圖舉例:通常情況下商品的詳情信息都比較長(zhǎng),而且查看商品列表時(shí)往往不需要立即展示商品詳情(一般都是點(diǎn)擊詳情按鈕才會(huì)進(jìn)行顯示),而是會(huì)將商品更重要的信息(價(jià)格等)展示出來(lái),按照這個(gè)業(yè)務(wù)邏輯,我們將原來(lái)的商品表做了垂直分表。

2.3.3 水平分表

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

圖片

水平分表

圖片

水平分表

2.3.4 水平分庫(kù)

水平分庫(kù)就是對(duì)單個(gè)數(shù)據(jù)庫(kù)水平切一刀,往往伴隨著水平分表。

圖片

水平分庫(kù)

圖片

水平分庫(kù)

2.3.5 總結(jié)

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

2.4 消息隊(duì)列削峰

通常情況下,用戶的請(qǐng)求會(huì)直接訪問(wèn)數(shù)據(jù)庫(kù),如果同一時(shí)刻在線用戶數(shù)量非常龐大,極有可能壓垮數(shù)據(jù)庫(kù)(參考明星出軌或公布戀情時(shí)微博的狀態(tài))。

這種情況下可以通過(guò)使用消息隊(duì)列降低數(shù)據(jù)庫(kù)的壓力,不管同時(shí)有多少個(gè)用戶請(qǐng)求,先存入消息隊(duì)列,然后系統(tǒng)有條不紊地從消息隊(duì)列中消費(fèi)請(qǐng)求。

圖片

隊(duì)列削峰

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7002

    瀏覽量

    88938
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    9123

    瀏覽量

    85322
  • MySQL
    +關(guān)注

    關(guān)注

    1

    文章

    804

    瀏覽量

    26526
  • 服務(wù)端
    +關(guān)注

    關(guān)注

    0

    文章

    66

    瀏覽量

    7004
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    MySQL的執(zhí)行過(guò)程 SQL語(yǔ)句性能優(yōu)化常用策略

    回顧 MySQL 的執(zhí)行過(guò)程,幫助介紹如何進(jìn)行 sql 優(yōu)化。
    的頭像 發(fā)表于 12-12 10:26 ?650次閱讀
    <b class='flag-5'>MySQL</b>的執(zhí)行過(guò)程 SQL語(yǔ)句<b class='flag-5'>性能</b><b class='flag-5'>優(yōu)化</b>常用策略

    MySQL性能優(yōu)化淺析及線上案例

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

    mysql的查詢優(yōu)化

    mysql查詢優(yōu)化
    發(fā)表于 03-12 11:06

    MySQL優(yōu)化之查詢性能優(yōu)化之查詢優(yōu)化器的局限性與提示

    MySQL優(yōu)化三:查詢性能優(yōu)化之查詢優(yōu)化器的局限性與提示
    發(fā)表于 06-02 06:34

    MySQL索引使用優(yōu)化和規(guī)范

    MySQL - 索引使用優(yōu)化和規(guī)范
    發(fā)表于 06-15 16:01

    MySql5.6性能優(yōu)化最佳實(shí)踐

    MySql5.6性能優(yōu)化最佳實(shí)踐
    發(fā)表于 09-08 08:47 ?13次下載
    <b class='flag-5'>MySql</b>5.6<b class='flag-5'>性能</b><b class='flag-5'>優(yōu)化</b>最佳實(shí)踐

    幫助優(yōu)化MySQL數(shù)據(jù)庫(kù)性能的7個(gè)技巧

    隨著尺寸和負(fù)載的增長(zhǎng),MySQL性能會(huì)趨于下降。記住這些訣竅,便可保持MySQL的流暢運(yùn)行。 測(cè)量應(yīng)用程序的方法之一是看性能。而
    發(fā)表于 11-30 15:03 ?798次閱讀
    幫助<b class='flag-5'>優(yōu)化</b><b class='flag-5'>MySQL</b>數(shù)據(jù)庫(kù)<b class='flag-5'>性能</b>的7個(gè)技巧

    詳解MySQL的查詢優(yōu)化 MySQL邏輯架構(gòu)分析

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

    MySQL數(shù)據(jù)庫(kù):理解MySQL性能優(yōu)化優(yōu)化查詢

    最近一直在為大家更新MySQL相關(guān)學(xué)習(xí)內(nèi)容,可能有朋友不懂MySQL的重要性。在程序,語(yǔ)言,架構(gòu)更新?lián)Q代頻繁的今天,MySQL 恐怕是大家使用最多的存儲(chǔ)數(shù)據(jù)庫(kù)了。由于MySQL
    的頭像 發(fā)表于 07-02 17:18 ?3090次閱讀
    <b class='flag-5'>MySQL</b>數(shù)據(jù)庫(kù):理解<b class='flag-5'>MySQL</b>的<b class='flag-5'>性能</b><b class='flag-5'>優(yōu)化</b>、<b class='flag-5'>優(yōu)化</b>查詢

    MySQL索引的使用問(wèn)題

    一、前言 在MySQL進(jìn)行SQL優(yōu)化的時(shí)候,經(jīng)常會(huì)在一些情況下,對(duì)MySQL能否利用索引有一些迷惑。譬如:1、
    的頭像 發(fā)表于 01-06 16:13 ?1601次閱讀

    利用MySQL進(jìn)行一主一的主從復(fù)制

    本文講述了如何使用MyBatisPlus+ShardingSphereJDBC進(jìn)行讀寫(xiě)分離,以及利用MySQL進(jìn)行一主一的主從復(fù)制。
    的頭像 發(fā)表于 07-28 09:47 ?1030次閱讀

    會(huì)哪些維度進(jìn)行MySQL性能優(yōu)化?2

    會(huì)哪些維度進(jìn)行MySQL性能
    的頭像 發(fā)表于 03-03 10:23 ?499次閱讀
    <b class='flag-5'>你</b><b class='flag-5'>會(huì)</b><b class='flag-5'>從</b>哪些<b class='flag-5'>維度</b><b class='flag-5'>進(jìn)行</b><b class='flag-5'>MySQL</b><b class='flag-5'>性能</b><b class='flag-5'>優(yōu)化</b>?2

    如何將數(shù)據(jù)MySQL遷移到Influxdb中

    如果以前是將時(shí)序數(shù)據(jù)存放在MySQL,現(xiàn)在為了獲取更好的性能和使用可視化工具,我們需要將數(shù)據(jù)MySQL遷移到Influxdb中。 這看起來(lái)是一個(gè)常見(jiàn)場(chǎng)景,經(jīng)過(guò)一番查閱,發(fā)現(xiàn)了
    的頭像 發(fā)表于 11-02 10:54 ?1228次閱讀

    MySQL性能優(yōu)化方法

    MySQL 性能優(yōu)化是一項(xiàng)關(guān)鍵的任務(wù),可以提高數(shù)據(jù)庫(kù)的運(yùn)行速度和效率。以下是一些優(yōu)化方法,包括具體代碼和詳細(xì)優(yōu)化方案。
    的頭像 發(fā)表于 11-22 09:59 ?595次閱讀

    MySQL執(zhí)行過(guò)程:如何進(jìn)行sql 優(yōu)化

    1)客戶端發(fā)送一條查詢語(yǔ)句到服務(wù)器; (2)服務(wù)器先查詢緩存,如果命中緩存,則立即返回存儲(chǔ)在緩存中的數(shù)據(jù); (3)未命中緩存后,MySQL 通過(guò)關(guān)鍵字將 SQL 語(yǔ)句進(jìn)行解析,并生成一顆對(duì)應(yīng)的解析樹(shù),
    的頭像 發(fā)表于 12-12 10:19 ?399次閱讀
    <b class='flag-5'>MySQL</b>執(zhí)行過(guò)程:如何<b class='flag-5'>進(jìn)行</b>sql <b class='flag-5'>優(yōu)化</b>
    RM新时代网站-首页