在学习具体的Postgresql用法以前,咱们来思考一下Postgresql与目前最经常使用的关系型数据库MySQL的区别在哪里,主要集中在二者的底层结构、使用场景和特别之处。html
当咱们去选择项目使用的数据库的时候,应该要考虑该项目的应用场景、数据规模等因素。每一种数据库都有它特定的应用场景,好比咱们如今要讨论的Postgresql和MySQL数据库,这两种的数据库的应用场景就有所不一样,下面咱们就它们的相同点和不一样点进行讨论。mysql
此表来源于postgresqltutorial,详细区别了二者的不一样点。sql
特性 | Postgresql | MySQL |
---|---|---|
描述 | The world’s most advanced open source database | The world’s most popular open source database |
发展 | PostgreSQL is an open source project | MySQL is an open-source product |
实现语言 | C | C、C++ |
图形化工具 | PgAdmin | MySQL Workbench |
ACID | Yes | Yes |
存储引擎 | Single storage engine | Multiple storage engines e.g., InnoDB and MyISAM |
全文检索 | Yes | Yes |
Drop a temporary table(删除一个临时表) | No TEMP or TEMPORARY keyword in DROP TABLE statement(随着数据库的链接的断开而被删除) |
MySQL supports the TEMP or TEMPORARY keyword in the DROP TABLE statement that allows you to remove the temporary table only.(须要手动删除) |
DROP TABLE (删除表) |
Support CASCADE option to drop table’s dependent objects e.g., tables, views, etc.,(级联操做:也就是更新、删除父表,将会同步更新、删除子表;而反过来则不变) |
Does not support CASCADE option |
TRUNCATE TABLE (删除表) |
PostgreSQL TRUNCATE TABLE supports more features like CASCADE , RESTART IDENTITY , CONTINUE IDENTITY , transaction-safe, etc.(对于移除表中的数据,delete是能够的,可是对于一个大表,truncate是更加有效的方式,由于truncate删除表中全部行的时候不须要扫表整个表) |
MySQL TRUNCATE TABLE does not support CASCADE and transaction safe i.e,. once data is deleted, it cannot be rolled back.(永久性删除,不能够撤销) |
自动增长列 | SERIAL |
AUTO_INCREMENT |
解析功能 | Yes | No |
Data types | Support many advanced types such as array, hstore, and user-defined type. | SQL-standard types |
Unsigned integer | No | Yes |
Boolean type | Yes | Use TINYINT(1) internally for Boolean |
IP address data type | Yes | No |
设置列默认值 | Support both constant and function call | Must be a constant or CURRENT_TIMESTAMP for TIMESTAMP or DATETIME columns |
CTE(Common Table Expressions) | Yes | No |
EXPLAIN output |
More detailed | Less detailed |
Materialized views(物化视图) | Yes(Postgresql将视图概念扩展到下一个级别,容许视图在物理上存储数据,咱们将这些视图称为物化视图,物化视图会缓存复杂的查询结果,而后容许按期刷新此结果) | No |
CHECK constraint(检查约束) | Yes | No (MySQL ignores the CHECK constraint) |
Table inheritance(表继承) | Yes | No |
Programming languages for stored procedures | Ruby, Perl, Python, TCL, PL/pgSQL, SQL, JavaScript, etc. | SQL:2003 syntax for stored procedures |
FULL OUTER JOIN (全外链接) |
Yes | No |
INTERSECT |
Yes(Postgresql的INTERSECT运算符将两个或多个SELECT语句的结果集合并到一个结果集中) | No |
EXCEPT |
Yes(Except运算符经过比较两个或多个quires的结果集来返回行,此返回行存在于第一查询子句而不存在第二查询子句中) | No |
Partial indexes(部分索引) | Yes | No |
Bitmap indexes(位图索引) | Yes | No |
Expression indexes(表达式索引) | Yes | NO |
Covering indexes(覆盖索引) | Yes (since version 9.2)例子1、例子2 | Yes. MySQL supports covering indexes that allow data to be retrieved by scanning the index alone without touching the table data. This is advantageous in case of large tables with millions of rows. |
Common table expression (CTE) | Yes | Yes. (since version 8.0, MySQL has supported CTE) |
Triggers(触发器) | Support triggers that can fire on most types of command, except for ones affecting the database globally e.g., roles and tablespaces. | Limited to some commands |
Partitioning(分区) | RANGE, LIST | RANGE, LIST, HASH, KEY, and composite partitioning using a combination of RANGE or LIST with HASH or KEY subpartitions |
Task Schedule(任务定时) | pgAgent | Scheduled event |
Connection Scalability(链接规模) | Each new connection is an OS process(进程) | Each new connection is an OS thread(线程) |
SQL compliant(SQL兼容性) | PostgreSQL is largely SQL compliant. | MySQL is partially SQL compliant. For example, it does not support check constraint. |
Best suited | PostgreSQL performance is utilized when executing complex queries. | MySQL performs well in OLAP& OLTP systems when only read speeds are needed. |
Support for JSON | Support JSON and other NoSQL features like native XML support. It also allows indexing JSON data for faster access. | MySQL has a JSON data type support but does not support any other NoSQL feature. |
Default values | The default values can be changed at the system level only | The default values can be overwritten at the session level and the statement level |
B-tree Indexes | B-tree indexes merged at runtime to evaluate are dynamically converted predicates. | Two or more B-tree indexes can be used when it is appropriate. |
Object statistics | Very good object statistics | Fairly good object statistics |
对于上面有部分疑惑的点进行详细分析:数据库
做用:Postgresql full outer join返回来自两个参与表的全部行,若是他们在相对的表上没有匹配,则使用null填充。full outer join组合了左外连接和右外链接的结果,并返回链接子句两侧表中的全部行(匹配或者不匹配)行。express
After comparing both we can say that MySQL has done a great job of improving itself to keep relevant, but on the other side for PostgreSQL, you don't need any licensing. It also offers table inheritance, rules systems, custom data types, and database events. So, it certainly edges above MySQL.缓存
www.guru99.com/postgresql-…session