使用mysql異步查詢,需要使用mysqlnd作為PHP的MySQL數(shù)據(jù)庫(kù)驅(qū)動(dòng)。 使用MySQL異步... 如果創(chuàng)建的線程過(guò)多,則會(huì)造成線程切換引起系統(tǒng)負(fù)載過(guò)高。Swoole中的異步MySQL其...
創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比左貢網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式左貢網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋左貢地區(qū)。費(fèi)用合理售后完善,十多年實(shí)體公司更值得信賴。
限流算法目前程序開(kāi)發(fā)過(guò)程常用的限流算法有兩個(gè):漏桶算法和令牌桶算法。
漏桶算法
漏桶算法的原理比較簡(jiǎn)單,請(qǐng)求進(jìn)入到漏桶中,漏桶以一定的速率漏水。當(dāng)請(qǐng)求過(guò)多時(shí),水直接溢出??梢钥闯?,漏桶算法可以強(qiáng)制限制數(shù)據(jù)的傳輸速度。如圖所示,把請(qǐng)求比作是水滴,水先滴到桶里,通過(guò)漏洞并以限定的速度出水,當(dāng)水來(lái)得過(guò)猛而出水不夠快時(shí)就會(huì)導(dǎo)致水直接溢出,即拒絕服務(wù)。
圖片來(lái)自網(wǎng)絡(luò)
漏桶的出水速度是恒定的,那么意味著如果瞬時(shí)大流量的話,將有大部分請(qǐng)求被丟棄掉(也就是所謂的溢出)。
令牌桶算法
令牌桶算法的原理是系統(tǒng)以一定速率向桶中放入令牌,如果有請(qǐng)求時(shí),請(qǐng)求會(huì)從桶中取出令牌,如果能取到令牌,則可以繼續(xù)完成請(qǐng)求,否則等待或者拒絕服務(wù)。這種算法可以應(yīng)對(duì)突發(fā)程度的請(qǐng)求,因此比漏桶算法好。
圖片來(lái)自網(wǎng)絡(luò)
漏桶算法和令牌桶算法的選擇
兩者的主要區(qū)別漏桶算法能夠強(qiáng)行限制處理數(shù)據(jù)的速率,不論系統(tǒng)是否空閑。而令牌桶算法能夠在限制數(shù)據(jù)的平均處理速率的同時(shí)還允許某種程度的突發(fā)流量。如何理解上面的含義呢?漏桶算法,比如系統(tǒng)吞吐量是 120/s,業(yè)務(wù)請(qǐng)求 130/s,使用漏斗限流 100/s,起到限流的作用,多余的請(qǐng)求將產(chǎn)生等待或者丟棄。對(duì)于令牌桶算法,每秒產(chǎn)生 100 個(gè)令牌,系統(tǒng)容量 200 個(gè)令牌。正常情況下,業(yè)務(wù)請(qǐng)求 100/s 時(shí),請(qǐng)求能被正常被處理。當(dāng)有突發(fā)流量過(guò)來(lái)比如 200 個(gè)請(qǐng)求時(shí),因?yàn)橄到y(tǒng)容量有 200 個(gè)令牌可以同一時(shí)刻處理掉這 200 個(gè)請(qǐng)求。如果是漏桶算法,則只能處理 100 個(gè)請(qǐng)求,其他的請(qǐng)求等待或者被丟棄。
在互聯(lián)網(wǎng)公司中,MySQL是使用最多的數(shù)據(jù)庫(kù),那么在并發(fā)量大、數(shù)據(jù)量大的互聯(lián)網(wǎng)業(yè)務(wù)中,如果高效的使用MySQL才能保證服務(wù)的穩(wěn)定呢?根據(jù)本人多年運(yùn)維管理經(jīng)驗(yàn)的總結(jié),梳理了一些核心的開(kāi)發(fā)規(guī)范,希望能給大家?guī)?lái)一些幫助。
一、基礎(chǔ)規(guī)范
二、庫(kù)表設(shè)計(jì)
問(wèn)題:使用VARCHAR(5) 和VARCHAR(200) 存儲(chǔ)’hello’的磁盤空間開(kāi)銷是一樣的,使用更短的列表有什么優(yōu)勢(shì)嗎?
更大的定義列會(huì)消耗更多的內(nèi)存,因?yàn)镸ySQL通常會(huì)分配固定大小的內(nèi)存塊來(lái)保存內(nèi)部值,尤其是使用內(nèi)存臨時(shí)表進(jìn)行排序或操作時(shí)會(huì)特別糟糕
三、索引設(shè)計(jì)
基本規(guī)則:索引不是越多越好,能不添加的索引盡量不要添加,過(guò)多的索引會(huì)嚴(yán)重降低數(shù)據(jù)插入和更新的效率,并帶來(lái)更多的讀寫(xiě)沖突和死鎖!
示例:假設(shè)在表tab中id建立了索引
四、SQL優(yōu)化
示例:
字段: code varchar(50) NOT NULL COMENT ‘編碼’ #code上建立了索引
SELECT id,name,addr from tab_name where code=10001; 不會(huì)使用索引
SELECT id,name,addr from tab_name where code='10001'; 會(huì)使用索引
Select * from table limit 10000,10;
LIMIT原理:
Limit 10000,10 偏移量越大則越慢
Select * from table WHERE id=23423 limit 11; #10+1 (每頁(yè)10條)
Select * from table WHERE id=23434 limit 11;
Select * from table WHERE id = ( select id from table limit 10000,1 ) limit 10;
Select * from table INNER JOIN (SELECT id from table limit 10000,10) USING(id)
最后說(shuō)明:
上述規(guī)范是多年MySQL數(shù)據(jù)庫(kù)使用的經(jīng)驗(yàn)總結(jié),希望能給大家?guī)?lái)一些啟發(fā)和幫助!