心动不如行动,基于Docker安装关系型数据库PostgrelSQL替代Mysql
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_171
最近“全栈数据库”的概念甚嚣尘上,主角就是PostgrelSQL,它最近这几年的技术发展不可谓不猛,覆盖OLTP、OLAP、NoSQL、搜索、图像等应用场景,实实在在的全栈性发展。帮助公司解决了数据孤岛、数据平台多、同步一致性、延迟,软硬件成本增加等业务痛点,在互联网、金融、物联网、传统企业等领域得到了广泛的应用。PostgreSQL的应用场景丰富,不亚于商用数据库Oracle,常被业界称为“开源界的Oracle”。
至于Mysql大家都很熟悉,很多公司因为人才储备和数据量大的原因,一般是Hadoop+Mysql的模式,Hadoop计算大量原始数据,然后按维度汇总后的展示数据存储在Mysql上,但是Mysql也有很多的“坑”:比如著名的Emoji表情坑,由此引申出来的utf8mb4的坑(隐式类型转换陷阱),性能低到发指的悲观锁机制,不支持多表单序列中取 id,不支持over子句,几乎没有性能可言的子查询…有点罄竹难书的意思,更多的“罪行”详见:见鬼的选择:Mysql。而这些问题,在PostgrelSQL中得到了改善,本次我们在Win10平台利用Docker安装PostgrelSQL,并且初步感受一下它的魅力。
第一步当然是安装Docker,不熟悉的同学请参照:win10系统下把玩折腾DockerToolBox以及更换国内镜像源(各种神坑)。
随后拉取镜像,这里我们选择相对稳定的PostgrelSQL11.1。
docker pull postgres:11.1
拉取成功后,输入命令查看镜像
docker images
可以看到,它的镜像非常小,大概300m左右,比Mysql小很多。
然后我们就可以将容器启动了,输入命令
docker run -d --name dev-postgres -e POSTGRES_PASSWORD=root -p 6432:5432 postgres:11.1
这里POSTGRES_PASSWORD是PostgrelSQL的用户密码,自己制定一个就可以了,默认端口号是5432,由于笔者的宿主机上已经安装好一个PostgrelSQL服务端,所以这里通过端口映射改成了6432。
输入命令
docker ps
来查看容器运行状态
没有问题,现在我们进入命令行操作一下。
docker exec -it dev-postgres bash
psql -h localhost -U postgres
这样就可以进入容器内部的命令行,在命令行输入PostgrelSQL的命令\l 就可以查看数据库列表。
建立数据库
CREATE DATABASE mytest;
使用数据库
\c mytest
建立一张表
CREATE TABLE "public"."article" (
"id" int4 NOT NULL,
"content" text,
PRIMARY KEY ("id")
)
WITH (OIDS=FALSE);
列出所有表
\d
如果不习惯使用命令行,也可以用可视化工具来进行链接,比如Navicat
注意默认用户是postgres,值得一提的是,使用navicat无法像Mysql一样手动设置属性自增长(auto-increment),PostgrelSQL使用的是序列的形式来实现自增长:
CREATE SEQUENCE serial START 1;
这里创建好的序列是从1开始计数。
随后,将需要设置的字段的默认值设为序列增长即可
ALTER TABLE "public"."article" ALTER COLUMN "id" SET DEFAULT nextval('serial');
可以使用utf-8编码轻松存储Emoji
over子句的应用,假设我们有一个员工薪资的表(部门、员工id,工资):
postgres=# d empsal
Table "public.empsal"
Column | Type | Modifiers
---------+-------------------+-----------
depname | character varying |
empno | integer |
salary | integer |
有一些数据:
postgres=# select * from empsal ;
depname | empno | salary
-----------+-------+--------
develop | 11 | 5200
develop | 7 | 4200
develop | 9 | 4500
develop | 8 | 6000
develop | 10 | 5200
personnel | 5 | 3500
personnel | 2 | 3900
sales | 3 | 4800
sales | 1 | 5000
sales | 4 | 4800
(10 rows)
现在我想将每一个员工的工资与他所在部门的平均工资做个比较,怎么做?其实这也是leetcode原题,用mysql只能用子查询,而用PostgrelSQL该查询可以很容易的实现
SELECT depname, empno, salary, avg(salary) OVER (PARTITION BY depname) FROM empsal;
查询结果:
depname | empno | salary | avg
-----------+-------+--------+-----------------------
develop | 11 | 5200 | 5020.0000000000000000
develop | 7 | 4200 | 5020.0000000000000000
develop | 9 | 4500 | 5020.0000000000000000
develop | 8 | 6000 | 5020.0000000000000000
develop | 10 | 5200 | 5020.0000000000000000
personnel | 5 | 3500 | 3700.0000000000000000
personnel | 2 | 3900 | 3700.0000000000000000
sales | 3 | 4800 | 4866.6666666666666667
sales | 1 | 5000 | 4866.6666666666666667
sales | 4 | 4800 | 4866.6666666666666667
(10 rows)
可以看到,这个查询中,聚合函数avg的含义没有变,仍然是求平均值。但和普通的聚合函数不同的是,它不再对表中所有的salary求平均值,而是针对同一个部门(PARTITION BY指定的depname)内的salary求平均值,而且得到的结果由同一个部门内的所有行共享,并没有将这些行合并,这就大大简化了sql的复杂度,同时也能很方便的解决 “每组取 top k” 的这类问题。
使用容器启动数据库会有个问题,就是每次容器停止,数据就会丢失,所有我们可以用docker的挂载命令将数据存在宿主机中,这样就可以持久化保存数据:
docker run -d --name dev-postgres -e POSTGRES_PASSWORD=root -e PGDATA=/var/lib/postgresql/data/pgdata
-v /custom/mount:/var/lib/postgresql/data -p 6432:5432 postgres:1.11
如果你不习惯navicat这样的桌面可视化工具,也可以使用类似pgadmin4这样的网页端工具
$ docker pull dpage/pgadmin4
$ docker run
-p 80:80
-e 'PGADMIN_DEFAULT_EMAIL=user@domain.local'
-e 'PGADMIN_DEFAULT_PASSWORD=SuperSecret'
--name dev-pgadmin
-d dpage/pgadmin4
也可以使用Python和PostgrelSQL进行交互,安装三方库:
pip3 isntall psycopg2
import psycopg2
import psycopg2.extras
conn = psycopg2.connect(host='localhost', port=6432, user='postgres', password='root', database='mytest')
cursor = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
cursor.execute('SELECT * FROM article WHERE id = 1;')
result = cursor.fetchone()
print(result)
就可以查询出数据了
结语:如果对Mysql足够熟悉,那么上手PostgrelSQL并不是一件难事,自从MySQL被Oracle收购的那一刻起,它就已经不是开源软件的最佳选择了。所以,不要固执的拒绝时代浪潮,拥抱未来,拥抱PostgrelSQL吧。
原文转载自「刘悦的技术博客」 https://v3u.cn/a_id_171
心动不如行动,基于Docker安装关系型数据库PostgrelSQL替代Mysql的更多相关文章
- zabbix基于docker安装
centos的版本 # cat /etc/redhat-release CentOS Linux release (Core) docker的安装 配置yum源 # vim /etc/yum.repo ...
- 基于docker安装pxc集群
基于docker安装pxc集群 一.PXC 集群的安装 PXC集群比较特殊,需要安装在 linux 或 Docker 之上.这里使用 Docker进行安装! Docker的镜像仓库中包含了 PXC数据 ...
- Docker——基于Docker安装Drupal博客系统
Docker--基于Docker安装Drupal博客系统 向脚本文件追加内容 cat << EOF > build.sh #设置主机名 hostnamectl set-hostnam ...
- 基于Docker安装常用软件
基于Docker安装常用软件 本实验介绍如何基于Docker安装常用的软件,具体包括: Ubuntu Cetnos Nginx Node.js PHP MySQL Tomcat Redis Mongo ...
- docker初识-docker安装、基于docker安装mysql及tomcat、基本命令
一.docker是什么 用go语言开发,开源的应用容器引擎,容器性能开销极低 二.整体架构图 Docker 包括三个基本概念: 镜像(Image):Docker 镜像(Image),就相当于是一个 r ...
- ubuntu docker安装与部署java,mysql,nginx镜像
docker 安装与部署java,mysql,nginx docker 配置 安装docker $ sudo apt-get remove docker docker-engine docker.io ...
- 使用Docker安装Oracle数据库
在很多时候,我们需要在本地安装Oracle数据库,但是整个安装的过程时间非常长而且安装文件大,那么有不有更好的办法来安装Oracle数据库既能减少安装的时间而且还能够快速进行部署呢?答案就是使用Doc ...
- mac系统用docker安装oracle数据库
oracle没有mac可用的版本,最好的办法是通过docker安装 一.下载docker 1.通过brew下载 brew cask install docker 2.手动下载(需要vpn) https ...
- 基于docker安装phpmyadmin
今天用到了phpadmin,要从头装的话,比较麻烦,所以就选择使用docker 安装 准备 任意Linux系统且已成功安装docker环境 安装phpmyAdmin 1. 拉取镜像 docker pu ...
随机推荐
- 服务器/网络/虚拟化/云平台自动化运维-ansible
ansible与netconf的对比 首先明确一个概念,netconf是协议,ansible是python编写的工具 netconf 使用YANG建模,XML进行数据填充,使用netconf协议进行传 ...
- 10┃音视频直播系统之 WebRTC 中的数据统计和绘制统计图形
一.数据统计 在视频直播中,还有一项比较重要,那就是数据监控 比如开发人员需要知道收了多少包.发了多少包.丢了多少包,以及每路流的流量是多少,才能评估出目前用户使用的音视频产品的服务质量是好还是坏 如 ...
- [持续更新] Python学习、使用过程中遇见的非代码层面知识(想不到更好的标题了 T_T)
写在前面: 这篇博文记录的不是python代码.数据结构.算法相关的内容,而是在学习.使用过程中遇见的一些没有技术含量,但有时很令人抓耳挠腮的小东西.比如:python内置库怎么看.python搜索模 ...
- SpringCloud基础概念学习笔记(Eureka、Ribbon、Feign、Zuul)
SpringCloud基础概念学习笔记(Eureka.Ribbon.Feign.Zuul) SpringCloud入门 参考: https://springcloud.cc/spring-cloud- ...
- 用C语言实现井字棋(人人/AI人机)--完结版
目录 用C语言实现井字棋(人人/AI人机)--完结版 BUG与优化3: 1. 修改了step的计算方法,每个玩家玩完就加一次step 2. 改变了电脑下棋的逻辑,每个玩家玩完之后都跳过这次循环 源码: ...
- Node.js躬行记(21)——花10分钟入门Node.js
Node.js 不是一门语言,而是一个基于 V8 引擎的运行时环境,下图是一张架构图. 由图可知,Node.js 底层除了 JavaScript 代码之外,还有大量的 C/C++ 代码. 常说 Nod ...
- CabloyJS全栈开发之旅(1):NodeJS后端编译打包全攻略
背景 毋庸置疑,NodeJS全栈开发包括NodeJS在前端的应用,也包括NodeJS在后端的应用.CabloyJS前端采用Vue+Framework7,采用Webpack进行打包.CabloyJS后端 ...
- C语言- 基础数据结构和算法 - 08 栈的应用_就近匹配20220611
听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...
- 26.MySQL数据库基础
MySQL数据库基础 目录 MySQL数据库基础 数据库的概念 数据 表 数据库 数据库的管理系(DBMS) 数据库系统 访问数据库的流程 数据库系统发展史 当今主流数据库介绍 关系数据库 关系数据库 ...
- 1.为什么要从古典概率入门概率学《zobol的考研概率论教程》
在入门概率论与数理统计这门课中,刚开始我们都会从古典概率开始学习,为什么要选择它呢?这是因为古典概率作为一种将生活中的事情简化为有限种情况,并假设它们的发生可能差不多的手段,十分的好用且简洁. 这里我 ...