{eval=Array;=+count(Array);}
謝邀,在BAT里曾經(jīng)接手過一個公司級的平臺開發(fā),接手的時候,這個平臺已經(jīng)上線2年了,但是卻經(jīng)常收到用戶投訴,說從網(wǎng)頁端來操作頁面的時候,響應(yīng)實在是太慢了,非常影響用戶體驗。
接手的時候,經(jīng)理就說了,一定要把用戶反饋的這個事情列為P0級問題,盡快解決。
于是,我馬上開始了分析。經(jīng)過在日志里打點,得知時間主要消耗在數(shù)據(jù)庫查詢上。根據(jù)我們之前的理論知識,我根本想象不到數(shù)據(jù)庫能被拖慢到這個地步。問題出現(xiàn)在一張存儲歷史任務(wù)的表格實在是太大了,新任務(wù)還在以每天百萬級的速度增長,而這張表的體量已經(jīng)達到了億。這種情況下,就算有索引,在頻繁寫表(創(chuàng)建任務(wù))的間隙去讀表(查任務(wù)),其效率也是非常低的。
我當時想到的第一個優(yōu)化方法是配置主從數(shù)據(jù)庫。主從配置的好處有三點,分別是1)讀寫分離,也有人稱之為負載均衡;2)數(shù)據(jù)異地備份,還有3)提高數(shù)據(jù)庫的可用性。當時配置主從的主要目的是希望能夠?qū)崿F(xiàn)讀寫分離,從而提高數(shù)據(jù)庫查詢的效率。配置過后,查詢效率確實有一定的提高,但是還遠未達到解決問題的程度。
在查閱了很多信息之后,我看到了很多人推薦使用elastic search作為持久層。
它是一個輕量型的存儲工具,雖然不是關(guān)系型數(shù)據(jù)庫,也不支持基本SQL語句,但是它具有能夠動態(tài)多節(jié)點部署,節(jié)點掉線后不影響全局數(shù)據(jù)的優(yōu)點,最重要的一點,在面對海量數(shù)據(jù)查詢時,它的表現(xiàn)要比MySQL優(yōu)秀許多。根據(jù)我們的實際測試,一張幾千萬的表格,如果存儲在MySQL中,利用非索引字段查詢,可能消耗數(shù)秒到數(shù)十秒,但是同樣的數(shù)據(jù)存儲在ElasticSearch中,只需要毫秒級別就能查詢到結(jié)果。簡直就是為我們遇到的問題量身定做的解決方案。
綜上,我們從兩個方面提供了優(yōu)化數(shù)據(jù)庫的思路,分別是配置主從與引入ElasticSearch。
以上是我的淺見,歡迎各位在下方評論區(qū)點贊留言互動。
我是蘇蘇思量,來自BAT的java開發(fā)程序員,每天分享科技類見聞,歡迎關(guān)注我,與我共同進步。
1.最重要的調(diào)整數(shù)據(jù)表的架構(gòu),以提升效率。通過架構(gòu)調(diào)整,減少關(guān)聯(lián)查詢,減少同步讀寫。用冗余字段,減少關(guān)聯(lián)。
2 大小字段分離。尤其是大字段,最好獨立表存儲(當然是數(shù)據(jù)量極為龐大時)
3.使用鏈接(join)來代替子查詢,速度將會快很多的。
4.合理索引!十分重要,必要時分表分庫。好的索引,使查詢提升1000倍,不是問題。
直接多PC SERVER搭建機群,把大數(shù)據(jù)庫拆分吧。有錢你就直接上小型機+Oracle數(shù)據(jù)庫
主要是多大的數(shù)據(jù)庫?16臺夠了吧?MySQL
針對數(shù)據(jù)庫優(yōu)化基本在有以下的步驟:
一、硬件的優(yōu)化
1)最粗放的方式就是提升硬件的配置,可以從CPU,內(nèi)存和磁盤方面給予回答。
二、DBA的優(yōu)化
1)最常用的方法是索引、索引、索引,加個索引可以將CPU的100%一下子降到10%左右
2)和開發(fā)溝通看看表里面的數(shù)據(jù)是否可以搬移或是刪除
三、開發(fā)的優(yōu)化
1)添加緩存,減少對數(shù)據(jù)庫的訪問,變相的減少數(shù)據(jù)庫的壓力
2)添加冗余字段,減少跨表查詢,采用反三范式的方法去設(shè)計表
3)SQL語名要規(guī)范,不允許用seelct * ,where條件中不允許用函數(shù)、like,not in,<>等;
四、架構(gòu)的優(yōu)化
1)數(shù)據(jù)庫設(shè)計要規(guī)范,避免存在大表,如表數(shù)據(jù)量過大,可以拆分成多個表
2)減少跨表查詢,最好使用單表去查詢數(shù)據(jù)
3)設(shè)計數(shù)據(jù)庫的時候要采用水平或是垂直拆分的方式,將數(shù)據(jù)打散。
注:有時候數(shù)據(jù)庫優(yōu)化不是單靠一個點去完成的,如果想要治本的話,得從多方面去入手。
0
回答0
回答0
回答0
回答0
回答0
回答0
回答0
回答0
回答0
回答