PostgreSQL 安装
PostgreSQL 是一款优秀的企业级数据库。
在这里,是 Oracle、 SQL Server、 MySQL、 PostgreSQL 四款数据库的比较。http://blog.csdn.net/ranran_5300/article/details/48129187
在这里挑几个和 PostgreSQL 相关的重点说一下:
(1)免费
(2)面向对象的关系型数据库
(3)可靠
(4)支持全文搜索
(5)查询速度快
(6)一个优秀的 PostgreSQL 中文文档 PostgreSQL 9.4.4 文档
PostgreSQL 关于 json jsonb 数据结构 官方文档页 PostgreSQL 9.4.26 Documentation 8.14. JSON Types
一、 PostgreSQL 下载并安装
1、 安装包安装方式
这里是 PostgreSQL 的官网: https://www.postgresql.org/
这里是下载地址: https://www.enterprisedb.com/downloads/postgres-postgresql-downloads
我在下载时,由于系统版本关系,下载了 PostgreSQL 10
在安装过程中,记得记住输入的数据密码就好,一般本地都是默认的就行,下面是安装概要

安装完成之后呢,会提示安装一些插件,为了性能起见,暂时不装,用到了再装就好。

2、 命令行安装方式
我们可能会更喜欢使用命令行方式安装软件,之前我在 ubuntu 上使用了下面所列方法,也成功安装了,而且,确实挺方便的。 http://www.ruanyifeng.com/blog/2013/12/getting_started_with_postgresql.html
二、 测试一下
顺便一说,用命令行方式安装的兄弟应该知道了 psql 是一个用户一个数据库的配置的。 
1、并发写入 100 万行数据
(1)准备 创建一个带索引和 text 字段的表 创建序列 创建存储过程
-- Table: public.passage
CREATE TABLE public.passage
(
id integer NOT NULL,
index_code integer,
title character varying(1024) COLLATE pg_catalog."default",
content text COLLATE pg_catalog."default",
CONSTRAINT passage_pkey PRIMARY KEY (id)
)
WITH (
OIDS = FALSE
)
TABLESPACE pg_default;
ALTER TABLE public.passage
OWNER to postgres;
COMMENT ON TABLE public.passage
IS '测试写入数据';
-- Index: passage_index_code_index
CREATE INDEX passage_index_code_index
ON public.passage USING btree
(index_code)
TABLESPACE pg_default;
-- CREATE SEQUENCE
CREATE SEQUENCE public.passage_id_seq
INCREMENT 1
START 1
MINVALUE 0
MAXVALUE 2147483646
CACHE 20;
ALTER SEQUENCE public.passage_id_seq
OWNER TO postgres;
-- FUNCTION: public.insert_passage_function()
CREATE OR REPLACE FUNCTION public.insert_passage_function(
)
RETURNS void
LANGUAGE 'plpgsql'
COST 100
VOLATILE
AS $BODY$
declare passage_content text;
declare i integer;
declare passage_index_code integer;
begin
for i in 1..1000000 loop
passage_index_code = random() * 10000 ;
insert into passage values(nextval('passage_id_seq'), passage_index_code, '文章标题' || passage_index_code, '文章内容' || passage_index_code || '文章内容');
end loop;
end;
$BODY$;
ALTER FUNCTION public.insert_passage_function()
OWNER TO postgres;
(2)运行 使用三个窗口同时运行函数 insert_passage_function ,可以看到,三条 SQL 的执行时间均为 25s 左右


2、查询效率
(1)索引字段查询效率 对索引字段执行 10000 次查询
-- FUNCTION: public.select_passage_function()
-- DROP FUNCTION public.select_passage_function();
CREATE OR REPLACE FUNCTION public.select_passage_function(
)
RETURNS void
LANGUAGE 'plpgsql'
COST 100
VOLATILE
AS $BODY$
declare i integer;
declare sql varchar;
begin
for i in 1..10000 loop
sql := 'select * from passage where index_code = ' || i;
execute sql;
end loop;
end;
$BODY$;
ALTER FUNCTION public.select_passage_function()
OWNER TO postgres;

(2)text 字段查询 对 text 字段进行 100 次 like %% 查询
-- FUNCTION: public.select_passage_like_function()
CREATE OR REPLACE FUNCTION public.select_passage_like_function(
)
RETURNS void
LANGUAGE 'plpgsql'
COST 100
VOLATILE
AS $BODY$
declare i integer;
declare sql varchar;
begin
for i in 1..10000 loop
sql := 'select * from passage where content like ''%' || i || '%''';
execute sql;
end loop;
end;
$BODY$;
ALTER FUNCTION public.select_passage_like_function()
OWNER TO postgres;

3、同等条件下 MySQL 执行情况
(1)3 线程并发写 100 万条数据,23s 左右 

(2)10000 次索引字段查询, 36s 左右

(3)100 次 text 字段 like 查询,呃,怎么说呢,6 分半钟左右,这个我就只跑了一次。不过,看来,这个性能差距是比较大的。

4、总结对比
以下测试尽量保证运行机器环境一样。
| 数据库 | MySQL(InnoDB) | PostgreSQL |
|---|---|---|
| 并发写入 300 万数据 | 23s | 25s |
| 10000 次索引字段查询 | 36s | 22s |
| 100 次 text 字段查询 | 390s | 33s-60s |