准备写一个系列,在年终岁尾之际,盘一盘大家或者是本人比较关心的一些数据。文章内容会包括数据获取的过程和数据可视化结果。今天先来看看各大数据库在过去一年的表现吧!
数据获取
所有的数据都来源自网站:db-engines.com/
一个数据库流行趋势统计网站。
Method 1
我们先来看获取数据方法一 首先我们可以在下面地址中看到一个包含所有数据库信息的表格


先抓取所有数据库名称信息,通过 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
下面再来介绍第二种方法,方法更简单,但是抓取时需要处理的地方更多些
我们可以直接访问下面的地址,同样的,在页面加载完成后,会返回所有数据库的历年数据信息

那么我们就可以直接解析此处的 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'])
两种方法各有优缺点,小伙伴儿们可以自行选择适合自己的方式。
数据库总榜

MySQL 似乎从来没有领用户失望,也是稳稳的占据二哥的位置。
而唯一挤进前五的非关系型数据库则是 MongoDB,在文档数据库领域,绝对是大哥大!
我们再来通过一张散点图来感受下不同数据库之间的差距

主流数据库榜单
我这里又选取了总榜中的前五名,再加上 key-value 数据库的代表 Redis 和搜索数据库的代表 ES 来作为对比对象,先来看看它们在 2019 年的整体走势

再来看下这七大数据库今年的增长率

下面我们再把时间拉长,看看从 2012 年到现在,各大数据库的表现情况

接下来再根据不同的数据库类型,来分别查看下各种类型数据库的流行趋势
关系型数据库
对于关系型数据库,榜首四强实在太强


key-value 数据库
再来看看 k-v 数据库,毫无疑问,近些年 Redis 风光无限,占据了大部分的市场份额。


文档数据库
现在进入到文档数据库时间,毫无疑问 MongoDB 的地位无可动摇

而 亚马逊的 Amazon DynamoDB 数据库凭借着云服务的兴趣,也成功占有一席之地

从历年流行度走势图种可以看出,MongoDB 在持续增长的路上,一骑绝尘了。而 Amazon DynamoDB 数据库则从 2017 年开始慢慢占据市场份额,拉开与其他文档数据库的差距。
时序数据库
时序数据库也有一个霸主,那就是 InfluxDB,不过整体来说,各方势力实力均衡!


图数据库
下面我们再来看看图数据库,它在知识图谱领域是当仁不让的首选数据库类型,尤其是 Neo4j,就算你没有使用过,怎么也听说过它的大名吧!

再来看看近些年的流行度走势呢

搜索数据库
最后我们再来看看搜索数据库的情况

那么再来看看历年的流行走势呢

不过无论是 ES 的耀眼光芒还是 Splunk 的新贵登基,可以预见的是在未来的很长一段时间里,搜索数据库领域仍然会是它们的三足鼎立!
END!