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

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

數據獲取

全部的數據都來源自網站:db-engines.com/redis

一個數據庫流行趨勢統計網站。數據庫

Method 1

咱們先來看獲取數據方法一 首先咱們能夠在下面地址中看到一個包含全部數據庫信息的表格bash

db-engines.com/en/rankingsession

而後能夠進入到每一個數據庫詳情頁面中,該數據庫歷年流行度數據都會在頁面加載以後包含在 JavaScript 的變量中

db-engines.com/en/ranking_…app

因此咱們能夠經過解析該 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, 1, 2, 3, 4, 5, 6, 7]]

# 處理數據
db_tb[3] = db_tb[3].apply(set_column3)

# 保存數據
db_tb.to_csv('db_tb.csv')
複製代碼

異步抓取數據庫詳細信息async

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

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

咱們能夠直接訪問下面的地址,一樣的,在頁面加載完成後,會返回全部數據庫的歷年數據信息oop

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!

相關文章
相關標籤/搜索