PostgreSQL 安装

PostgreSQL 是一款优秀的企业级数据库。

在这里,是 Oracle、 SQL Server、 MySQL、 PostgreSQL 四款数据库的比较。http://blog.csdn.net/ranran_5300/article/details/48129187open in new window

在这里挑几个和 PostgreSQL 相关的重点说一下:

(1)免费

(2)面向对象的关系型数据库

(3)可靠

(4)支持全文搜索

(5)查询速度快

(6)一个优秀的 PostgreSQL 中文文档 PostgreSQL 9.4.4 文档open in new window

PostgreSQL 关于 json jsonb 数据结构 官方文档页 PostgreSQL 9.4.26 Documentation 8.14. JSON Typesopen in new window

一、 PostgreSQL 下载并安装

1、 安装包安装方式

这里是 PostgreSQL 的官网: https://www.postgresql.org/open in new window

这里是下载地址: https://www.enterprisedb.com/downloads/postgres-postgresql-downloadsopen in new window

我在下载时,由于系统版本关系,下载了 PostgreSQL 10

在安装过程中,记得记住输入的数据密码就好,一般本地都是默认的就行,下面是安装概要

安装概要.png

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

Stack Builder.png

2、 命令行安装方式

我们可能会更喜欢使用命令行方式安装软件,之前我在 ubuntu 上使用了下面所列方法,也成功安装了,而且,确实挺方便的。 http://www.ruanyifeng.com/blog/2013/12/getting_started_with_postgresql.htmlopen in new window

二、 测试一下

顺便一说,用命令行方式安装的兄弟应该知道了 psql 是一个用户一个数据库的配置的。 psql.png

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 左右

插入数据.png

执行结果.png

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;


索引字段查询速度.png

(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;

text 字段查询速度.png

3、同等条件下 MySQL 执行情况

(1)3 线程并发写 100 万条数据,23s 左右 图片.png

MySQL 写入速度.png

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

MySQL 索引字段查询速度.png

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

MySQL text 字段查询速度.png

4、总结对比

以下测试尽量保证运行机器环境一样。

数据库MySQL(InnoDB)PostgreSQL
并发写入 300 万数据23s25s
10000 次索引字段查询36s22s
100 次 text 字段查询390s33s-60s