1. 程式人生 > 程式設計 >盤一盤十年資料庫流行度,哪款是你的最愛

盤一盤十年資料庫流行度,哪款是你的最愛

準備寫一個系列,在年終歲尾之際,盤一盤大家或者是本人比較關心的一些資料。文章內容會包括資料獲取的過程和資料視覺化結果。今天先來看看各大資料庫在過去一年的表現吧!

資料獲取

所有的資料都來源自網站:db-engines.com/

一個資料庫流行趨勢統計網站。

Method 1

我們先來看獲取資料方法一 首先我們可以在下面地址中看到一個包含所有資料庫資訊的表格

db-engines.com/en/ranking

然後可以進入到每個資料庫詳情頁面中,該資料庫歷年流行度資料都會在頁面載入之後包含在 JavaScript 的變數中

db-engines.com/en/ranking_…

所以我們可以通過解析該 JavaScript 程式碼來獲取每個資料庫的歷年資料,同時為了加快抓取速度,使用了非同步請求

先抓取所有資料庫名稱資訊,通過 pandas 的 read_html 方法可以方便的讀取 html 中的 table 資料

import pandas as pd


mystr = ' Detailed vendor-provided information available'


def set_column3(column3):
    if mystr in column3:
        column3 = column3.split(mystr)[0]
    return column3


url = 'https://db-engines.com/en/ranking'
tb = pd.read_html(url)
db_tb = tb[3].drop(index=[0,1,2])[[0,2,3,4,5,6,7]]

# 處理資料
db_tb[3] = db_tb[3].apply(set_column3) # 儲存資料 db_tb.to_csv('db_tb.csv') 複製程式碼

非同步抓取資料庫詳細資訊

async def fetch(session,url):
    async with session.get(url) as response:

        return await response.text()


async def get_db_data(db_name):
    url = 'https://db-engines.com/en/ranking_trend/system/%s' % db_name

    async with aiohttp.ClientSession() as session:
        res = await fetch(session,url)
        content = BeautifulSoup(res,"html.parser"
) content.find_all("script") db_data = content.find_all("script")[2].string src_text = js2xml.parse(db_data) src_tree = js2xml.pretty_print(src_text) data_tree = BeautifulSoup(src_tree,'html.parser') data_tree.find_all('number') data = [] for i in data_tree.find_all('number'): data.append(i['value']) date_list = gen_time('%s-%s' % (data[0],str(int(data[1]) + 1))) date_value = list(zip(date_list,data[3:])) d_data = zip([db_name for i in range(len(date_value))],date_value) await save_data(d_data) def gen_time(datestart,dateend=None): if dateend is None: dateend = time.strftime('%Y-%m',time.localtime(time.time())) datestart=datetime.datetime.strptime(datestart,'%Y-%m') dateend=datetime.datetime.strptime(dateend,'%Y-%m') date_list = list(OrderedDict(((datestart + timedelta(_)).strftime(r"%Y-%m"),None) for _ in range((dateend - datestart).days)).keys()) date_list.append('2019-12') return date_list if __name__ == '__main__': db_tb = pd.read_csv('db_tb.csv') db_name = db_tb['3'].values.tolist() loop = asyncio.get_event_loop() tasks = [get_db_data(name) for name in db_name] loop.run_until_complete(asyncio.wait(tasks)) loop.close() 複製程式碼

Method 2

下面再來介紹第二種方法,方法更簡單,但是抓取時需要處理的地方更多些

我們可以直接訪問下面的地址,同樣的,在頁面載入完成後,會返回所有資料庫的歷年資料資訊

db-engines.com/en/ranking_…

那麼我們就可以直接解析此處的 JavaScript 資訊,獲取對應資料庫的資料即可

不過由於有些資料庫的歷史資料有缺失,所以需要做特殊處理

    for i in data_tree.find_all('object'):
        date_list = gen_time('%s-%s' % (year_list[0],str(int(year_list[1]) + 1)))
        data = []
        tmp_list = []
        db_name = i.find('string')
        if i.find('null'):
            null_num = len(i.find_all('null'))
            tmp_list = list(zip(date_list[:null_num],['0' for i in range(null_num + 1)]))
            date_list = date_list[null_num:]
        for j in i.find_all('number'):
            data.append(j['value'])
複製程式碼

兩種方法各有優缺點,小夥伴兒們可以自行選擇適合自己的方式。

資料庫總榜

可以看出,關係型資料庫還是當今的王者,流行度前四名都被它們所佔據,而 Oracle 雖然連年表現不佳,為人詬病,但是依靠多年的積累,仍然牢牢把持著榜首的位置。

MySQL 似乎從來沒有領使用者失望,也是穩穩的佔據二哥的位置。

而唯一擠進前五的非關係型資料庫則是 MongoDB,在檔案資料庫領域,絕對是大哥大!

我們再來通過一張散點圖來感受下不同資料庫之間的差距

主流資料庫榜單

我這裡又選取了總榜中的前五名,再加上 key-value 資料庫的代表 Redis 和搜尋資料庫的代表 ES 來作為對比物件,先來看看它們在 2019 年的整體走勢

可以看到它們在2019年總體表現還是比較平穩的,其中榜首三強都是在年末出現了不同程度的下滑,而與之對應的則是 PG 資料庫的增長了。

再來看下這七大資料庫今年的增長率

可以看到 MySQL 是增長率最高的資料庫,而 redis 在 2019 年則表現不佳,呈現了負增長的趨勢。

下面我們再把時間拉長,看看從 2012 年到現在,各大資料庫的表現情況

Oracle 和 MS Server 整體來看確實呈現下降的趨勢,而 MySQL 則稍稍有些增長。同時 PostgreSQL 增長比較明顯,尤其是從 2017 年開始,流行度超越 MongoDB,相對應的,這個時間段也是榜首三大資料庫的下滑期。

接下來再根據不同的資料庫型別,來分別檢視下各種型別資料庫的流行趨勢

關係型資料庫

對於關係型資料庫,榜首四強實在太強

我們去除掉這四種資料庫,來看看其他關係型資料庫的歷年走勢

可以看出,IMB 的 DB2 和微軟的 Access 近年都有下滑的趨勢,而作為 MySQL 的開源版 MariaDB,則呈現了很強的上升趨勢,看來大家擁抱開源的信念不減呢!

key-value 資料庫

再來看看 k-v 資料庫,毫無疑問,近些年 Redis 風光無限,佔據了大部分的市場份額。

而曾經的王者 Memcached,則因為種種原因,流行度不斷下滑

可以看到,2016 年為起點,隨著雲端計算的風起雲湧,亞馬遜和微軟的 k-v 資料庫增長迅猛,而 Memcached 則逐漸衰落,但是 Redis 憑藉其良好的表現,仍然一路高歌!

檔案資料庫

現在進入到檔案資料庫時間,毫無疑問 MongoDB 的地位無可動搖

而 亞馬遜的 Amazon DynamoDB 資料庫憑藉著雲服務的興趣,也成功佔有一席之地

從歷年流行度走勢圖種可以看出,MongoDB 在持續增長的路上,一騎絕塵了。而 Amazon DynamoDB 資料庫則從 2017 年開始慢慢佔據市場份額,拉開與其他檔案資料庫的差距。

時序資料庫

時序資料庫也有一個霸主,那就是 InfluxDB,不過整體來說,各方勢力實力均衡!

Kdb、Prometheus 和 OpenTSDB 等都在各自擅長的領域發揮著不可替代的作用。

當然啦,InfluxDB 資料庫就是那顆最耀眼的星,迅猛的發展趨勢,讓它成功殺出重圍。而 RRDtool 資料庫卻多少有些高開低走的味道,不知道什麼時候能夠看到它王者歸來!

圖資料庫

下面我們再來看看圖資料庫,它在知識圖譜領域是當仁不讓的首選資料庫型別,尤其是 Neo4j,就算你沒有使用過,怎麼也聽說過它的大名吧!

再來看看近些年的流行度走勢呢

Neo4j 和 Microsoft Azure Cosmos DB 走勢迅猛,看來在知識圖譜興起的時代,圖資料庫也要呈現二分天下的態勢了。

搜尋資料庫

最後我們再來看看搜尋資料庫的情況

沒有一絲絲疑問,大火的 ES 成功佔據榜首,之後就是 Splunk 和 Solr,這三位基本佔據了搜尋資料庫的大部分市場。

那麼再來看看歷年的流行走勢呢

Solr 有些扎心了,隨著 ES 和 Splunk 的強勢崛起,Solr 似乎慢慢歸於平靜了。

不過無論是 ES 的耀眼光芒還是 Splunk 的新貴登基,可以預見的是在未來的很長一段時間裡,搜尋資料庫領域仍然會是它們的三足鼎立!

END!