Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > PostgreSQL与MySQL对比

PostgreSQL与MySQL的完整对比教程(含迁移步骤)

作者:XerCis

MySQL和PostgreSQL都是强大的关系型数据库管理系统,但它们适用于不同的用例和需求,这篇文章主要介绍了PostgreSQL与MySQL完整对比的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

结论

许可证

性能

使用Node.js的TypeORM库,分别对MySQL和PostgreSQL跑了3次写入读取更新操作,取均值(2060条数据)

对象层次结构

ACID事务

四种事务隔离级别:读未提交、读已提交、可重复读、串行化

对比项目MySQLPostgreSQL
隔离级别支持四种隔离级别,默认是读已提交支持四种隔离级别,默认是可重复读
存储引擎InnoDB存储引擎支持完整事务,MyISAM存储引擎不支持事务无明显存储引擎区分,使用MVCC处理并发,支持高并发读写
锁机制InnoDB支持行级锁盒表级锁,但复杂更新操作时如果索引使用不当,会导致行级锁升级成表级锁,降低并发性能粒度较细,支持行级锁和表级锁,可更精确控制锁的范围,减少锁冲突,不影响其他行的并发操作
事务日志InnoDB使用redo log和undo log实现事务持久化和回滚WAL,记录事务变更操作,确保数据一致性和持久性
性能InnoDB引擎性能高效,但一些极端并发或复杂查询下会有性能瓶颈复杂查询和高并发事务的性能较稳定,处理大量并发操作时有优势

数据安全

查询优化器

性能优化工具

Sort:启动成本717.34,总成本717.59,预计返回101行,每行宽度488字节。实际执行时间7.761-7.774毫秒,返回100行,循环1次。排序键为t1.fivethous,排序方法快速排序,使用内存77KB。
Hash Join:启动成本230.47,总成本713.98,预计返回101行,每行宽度488字节。实际执行时间0.711-7.427毫秒,返回100行,循环1次。连接条件为t2.unique2 = t1.unique2。
Seq Scan on tenk2 t2:对tenk2表进行顺序扫描,成本为0-445,预计返回10000行,每行宽度244字节。实际执行时间0.007-2.583 毫秒,实际返回10000行,循环1次。
Hash:启动成本229.20,总成本229.20,预计返回101行,每行宽度4244字节。实际执行时间0.659-0.659毫秒,返回100行,循环1次。
Buckets:哈希桶数量1024,批次1,使用内存28KB。
Bitmap Heap Scan on tenk1 t1:对tenk1表进行位图堆扫描,启动成本5.07-229.20,预计返回101行,每行宽度244字节。实际执行时间0.080-0.526毫秒,实际返回100行,循环1次。
Recheck Cond:重新检查条件为unique1<100。
Bitmap Index Scan on tenk1_unique1:对tenk1表的tenk1_unique1索引进行位图索引扫描,启动成本0.00-5.04,预计返回101行,每行宽度0字节。实际执行时间0.049-0.049毫秒,实际返回100行,循环1次。
Index Cond:索引条件为unique1<100。
Planning time:查询计划生成时间为0.194毫秒。
Execution time:查询执行总时间为8.008毫秒。

监控工具

JSON操作

项目MySQLPostgreSQL
数据类型仅支持JSON支持 JSON 和 JSONB(性能更好)
JSON函数提取JSON_EXTRACT
包含JSON_CONTAINS
提取->和->>
包含@>
更丰富的函数和高级功能
索引对 JSON 列创建虚拟列,再对虚拟列创建索引可以直接对JSONB 创建 GIN 索引
标准遵循和扩展遵循JSON标准,扩展较少遵循JSON标准扩展较多,有更丰富的函数和操作符
性能复杂JSON查询性能很差JSONB的复杂性能查询很好

窗口函数

窗口函数也叫 OLAP 函数,对数据库数据进行实时分析处理,实现合计和分类汇总,如学生成绩表计算出总分、平均分、按课程汇总。适合做数据仓库。

项目MySQLPostgreSQL
窗口帧类型仅支持Row Frame支持Row Frame和范围帧
范围单位仅支持UNBOUNDED PRECEDING和 CURRENT ROW还支持UNBOUNDED FOLLOWING和BETWEEN
高级函数ROW_NUMBER() 行号
RANK() 排名
DENSE_RANK() 行排名
LEAD() 当前行后几行,比较趋势
LAG() 当前行前几行
性能一般更好

插件

# 启用扩展
CREATE EXTENSION postgis;

# 创建空间数据表
CREATE TABLE city (
    id SERIAL PRIMARY KEY,
    city_name VARCHAR(50),
    location GEOMETRY(Point, 4326)
);

# 插入数据(EPSG:4326:WGS84坐标系,全球通用)
INSERT INTO city (city_name, location)
VALUES 
    ('深圳', ST_SetSRID(ST_MakePoint(114.0596, 22.5429), 4326)),
    ('广州', ST_SetSRID(ST_MakePoint(113.2644, 23.1291), 4326)),
    ('武汉', ST_SetSRID(ST_MakePoint(114.3052, 30.5928), 4326)),
    ('青岛', ST_SetSRID(ST_MakePoint(120.3830, 36.0662), 4326)),
    ('北京', ST_SetSRID(ST_MakePoint(116.4074, 39.9042), 4326));

# 查询两个城市之间的距离(EPSG:4527:基于国家大地坐标系的投影坐标系)
SELECT ST_Distance(
        ST_Transform((SELECT location FROM city WHERE city_name = '深圳'), 4527),
        ST_Transform((SELECT location FROM city WHERE city_name = '北京'), 4527));
# 1938597.1881722098

# 查询200公里内的城市
SELECT city_name FROM city 
WHERE ST_DWithin(
        ST_Transform(location, 4527),
        ST_Transform((SELECT location FROM city WHERE city_name = '深圳'), 4527), 
        200000);
# 深圳
# 广州

易用性

项目MySQLPostgreSQL
GROUP BY允许包含非聚合列不允许包含非聚合列
大小写大小写不敏感大小写敏感,citext可实现大小写不敏感
JOIN允许连接不同数据库的表只允许连接单个数据库内的表,除非用扩展 postgres_fdw

连接模型

可运维性

项目MySQLPostgreSQL
备份和恢复mysqldump
支持binlog增量备份和恢复
pg_dump、pg_dumpall、pg_basebackup
支持WAL日志增量备份,pg_ctl恢复
高可用性主从复制,有概率丢数据同步复制(流复制),零数据丢失
权限控制数据库、表、列级别数据库、模式、表、列、函数级别,更精细
还支持角色概念,方便管理

书写SQL

项目MySQLPostgreSQL
数据类型INT、VARCHAR可指定长度,但一般不影响存储大小、DATETIMEINTEGER、VARCHAR不使用显示长度、TIMESTAMP
字符串拼接CONCAT()|| 或 CONCAT()
自增主键AUTO_INCREMENTSERIAL / BIGSERIAL
事务START TRANSACTIONBEGIN TRANSACTION
改表名RENAME TABLE A TO BALTER TABLE A RENAME TO B
ROLLUPGROUP BY xxx WITH ROLLUPGROUP BY ROLLUP (xxx)
条件分支CASECASE 和 IF
存储过程CREATE PROCEDUREDELIMITER
CREATE PROCEDURE

如何从MySQL迁移到PostgreSQL

规划与准备

  1. 分析 MySQL 数据库的结构,包括表、视图、存储过程、触发器等。确定数据量大小、数据类型、复杂程度,评估迁移的难度和工作量。
  2. 检查 MySQL 中使用的特定功能,如自增主键、日期时间格式、字符集等,确保在 PostgreSQL 中有替代方案。
  3. 安装并配置 PostgreSQL 数据库。
  4. 准备好迁移工具,如手动导入使用mysqldump结合psql,自动化工具使用pgloader。

迁移表结构和数据

迁移存储过程、函数、触发器

测试与验证

总结 

到此这篇关于PostgreSQL与MySQL完整对比教程的文章就介绍到这了,更多相关PostgreSQL与MySQL对比内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文