數據庫十年巔峰對決,誰才是真正的王者?
在年終歲尾之際,盤一盤大家比較關心的一些數據。今天先來看看各大數據庫在過去一年的表現!
圖片來自 Pexels
先來看看數據庫流行度總體走勢:
視頻請查看這里
數據獲取
所有的數據都來源自一個數據庫流行趨勢統計網站:
- https://db-engines.com/
Method 1
我們先來看獲取數據方法,首先我們可以在下面地址中看到一個包含所有數據庫信息的表格:
- https://db-engines.com/en/ranking
然后可以進入到每個數據庫詳情頁面中,該數據庫歷年流行度數據都會在頁面加載之后包含在 JavaScript 的變量中:
- https://db-engines.com/en/ranking_trend/system/Oracle
所以我們可以通過解析該 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 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
下面再來介紹第二種方法,方法更簡單,但是抓取時需要處理的地方更多一些。
我們可以直接訪問下面的地址,同樣的,在頁面加載完成后,會返回所有數據庫的歷年數據信息:
- https://db-engines.com/en/ranking_trend
那么我們就可以直接解析此處的 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,相對應的,這個時間段也是榜首三大數據庫的下滑期。
接下來再根據不同的數據庫類型,來分別查看下各種類型數據庫的流行趨勢。
關系型數據庫
對于關系型數據庫,榜首四強實在太強:
我們去除掉這四種數據庫,來看看其他關系型數據庫的歷年走勢:
可以看出,IBM 的 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 的新貴登基,可以預見的是在未來的很長一段時間里,搜索數據庫領域仍然會是它們的三足鼎立!
最后再通過一個視頻,來看看不同類型數據庫的流行度變化情況:
視頻請查看這里
完整代碼:
- https://github.com/zhouwei713/data_analysis/tree/master/Annual_Ceremony/DB
作者:周蘿卜
簡介:Python 學習者。愛好爬蟲、數據分析及可視化等,個人公眾號《蘿卜大雜燴》,期待與你相遇!















































