MySQL的壓測

xuexiaogang發表於2021-12-13

自己原文公眾號: https://mp.weixin.qq.com/s/o7HjQwEVcbkWUkG6Hzlwsw

首先這個篇技術貼。前面先鋪墊一下,最近蘇伊士運河的各種新聞。 我以前讀中東戰爭時候不理解為什麼有一次叫蘇伊士運河戰爭,也不明白為什麼要爭奪西奈半島和戈蘭高地。這次算是徹底明白了。看到上面的圖,蘇伊士運河是咽喉要道,而半島和高地直接控制這片區域。


本文起因是系統的瓶頸是什麼?一般來說瓶頸都在資料庫,資料庫瓶頸都在IO。如果讓資料庫拜託IO,即我們都讀記憶體。會是如何?

基於以上我分幾天來說,今天是MySQL篇,後面再有Oracle和PG。水平有限就自己假設了。我們模擬一下登入,有不少人擔心繫統登入是瓶頸。其實不然。看看我們實驗。


create table user ( id int auto_increment,userid varchar(10),password varchar(10), primary key(id)) ;使用者表


create table qx (id int,userid varchar(10),qx varchar(10));許可權表


這裡是關鍵,為什麼?因為一般開發設計的許可權表特別複雜,效率不高。我這裡是理想化的設計,為了看看最快如何?


我見過別人設計的一登陸查選單,也不管用不用得到。選單是級聯的。10個父選單,每個父選單都有10個子選單,然後才來一級。所以一登陸就1000個SQL。實在不知道那家公司的是怎麼設計的,什麼腦回路。


這種一般都會對我說:

1、這是我們產品就這樣設計的

2、我們程式碼底層是這樣設計的

3、框架就這樣設計的。

總之一句話,讓我改是不可能的。

所以這裡(設計)就是蘇伊士運河,所有的問題我發現幾乎都來自設計或者實現。


資料庫是蘇伊士灣,雖然比起來外面的大海不具備可擴充套件性,但是處理這些還是綽綽有餘的,不是每個國家(公司)都是有十幾個航母編隊,幾千戰艦去把蘇伊士灣(資料庫承受能力以外)堵死的。


如果這兩個都解決不了,外面的星辰大海(地中海和紅海),就算你能擴充套件又如何?


create procedure 模擬50萬使用者,然後我們再寫一個儲存過程去讀這些資料。


DELIMITER //

CREATE   PROCEDURE  us()

 BEGIN  

 DECLARE   v int;

    SET v = 0; 

  loop_label: LOOP

        insert into  user (userid,password) values ( concat('t',v),v);

 SET v = v + 1; 

        IF v>=500000 THEN 

              LEAVE  loop_label;

          END IF;

          end loop;

END; //


其實資料庫的讀能力很強的,前幾天騰訊金融的姜老師發的MySQL每秒120 萬次QPS,那是用官方的壓測工具測試的,機器CPU也多。全部滿負荷的。

我們今天來試試單CPU的。


BEGIN

DECLARE   v int;

DECLARE  a varchar(10);

DECLARE b varchar(10);

DECLARE c varchar(10);

DECLARE  d varchar(10);

SET v = 0;

loop_label: LOOP

select  userid,password into a,b  from user where userid=concat('t',v);

select  userid,password into c,f  from qx where userid=concat('t',v);

SET v = v + 1;

IF v>=500000 THEN

LEAVE  loop_label;

END IF;

end loop;

END


僅僅表示拿到使用者名稱 密碼和許可權。這是登入最簡單的場景。如果你設計了登入以後還有很多操作要做,那你勢必影響登入效率。看看淘寶 京東 微博 登入都是比較簡單的頁面,沒有後臺實時計算什麼的。

我一直認為登入就應該是簡單的,不應該有壓力。因為查詢是所有資料庫中操作最輕的。


如果你登入都擔心,那就不擔心登入以後的瀏覽和下單嗎?那些操作才是真正的壓力。

單執行緒CPU全滿的效果是每秒1萬。50萬全部執行完畢大約50秒,平均每秒讀1萬次。

開了3個以後那麼3個CPU滿負荷也就是 說3個每秒1萬的登入是可以的。那麼我們得到一個理想化的結論,在設計簡化的前提下,承載能力是每秒每個CPU可以處理1萬次請求。充分利用資料庫多執行緒。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/637517/viewspace-2847518/,如需轉載,請註明出處,否則將追究法律責任。

相關文章