一、在Nodejs中使用MySQL數(shù)據(jù)庫(kù)的優(yōu)異實(shí)踐
1. 請(qǐng)一直使用pool,沒(méi)有何時(shí)。
2. pool在程序初始化的時(shí)候創(chuàng)建,無(wú)需銷毀,從中抽取實(shí)例連接就行,無(wú)需關(guān)心細(xì)節(jié),也無(wú)需手動(dòng)連接和關(guān)閉。
3. 推薦使用一個(gè)ORM庫(kù),例如 sequelize之類的,很多,包括我們公司自產(chǎn)的 toshihiko,可以簡(jiǎn)化掉很多細(xì)節(jié)
4. 多級(jí)連接沒(méi)什么需要注意的,主要是通過(guò)內(nèi)網(wǎng)ip連接,做好環(huán)境隔離,保證mysql服務(wù)的連接數(shù)夠用,合理設(shè)置每個(gè)服務(wù)的pool大小。
5. 數(shù)據(jù)庫(kù)設(shè)計(jì)是門(mén)大學(xué)問(wèn),數(shù)據(jù)庫(kù)優(yōu)化也是門(mén)大學(xué)問(wèn)。
pool程序啟動(dòng)的時(shí)候就建立,全程不需要關(guān)閉。一定要考慮并發(fā)(僅僅是并發(fā),還不是高并發(fā))下的業(yè)務(wù)邏輯問(wèn)題,盡量用樂(lè)觀鎖解決問(wèn)題,樂(lè)觀鎖是指 update table set a = new_value where version = old_version 這種類似形式,根據(jù)返回的affected rows 判斷是否更新成功。
讀寫(xiě)操作盡量去用內(nèi)存 緩存/隊(duì)列化處理,給mysql的最平緩的壓力。少用事務(wù)。
避免單表 or 單行 同時(shí)的讀寫(xiě)壓力。order by, group by,count(*) 加 join 這種操作大多效率低下,能避開(kāi)就避開(kāi)。
可以偶爾的反范式設(shè)計(jì),但需考慮如果數(shù)據(jù)不一致了怎么辦,plan b能同步回來(lái)就問(wèn)題不大。緩存,緩存,還是緩存。用內(nèi)存換mysql壓力 內(nèi)存可以LRU沒(méi)那么容易爆 mysql壓力大了很容易進(jìn)入雪崩。
延伸閱讀:
二、全文索引
FULLTEXT(全文)索引,僅可用于MyISAM和InnoDB,針對(duì)較大的數(shù)據(jù),生成全文索引非常的消耗時(shí)間和空間。對(duì)于文本的大對(duì)象,或者較大的CHAR類型的數(shù)據(jù),如果使用普通索引,那么匹配文本前幾個(gè)字符還是可行的,但是想要匹配文本中間的幾個(gè)單詞,那么就要使用LIKE %word%來(lái)匹配,這樣需要很長(zhǎng)的時(shí)間來(lái)處理,響應(yīng)時(shí)間會(huì)大大增加,這種情況,就可使用時(shí)FULLTEXT索引了,在生成FULLTEXT索引時(shí),會(huì)為文本生成一份單詞的清單,在索引時(shí)及根據(jù)這個(gè)單詞的清單來(lái)索引。FULLTEXT可以在創(chuàng)建表的時(shí)候創(chuàng)建,也可以在需要的時(shí)候用ALTER或者CREATE INDEX來(lái)添加。