在项目目录下,使用vi
编辑 postgresql.conf
,加入指令 :
log_min_duration_statement = 0
log_statement = all
log_duration = on
将执行的每一条命令所耗费的时间存入日志文件中。然后启动并连接数据库:
-
pg_ctl -D ./ -l ./pg.log start
:启动数据库 -
tail -f ./pg.log
:打开日志 -
psql pg_playground
:连接数据库 -
\d
:查询当前所有表 -
select * from users;
:查询表 users 中包含的数据 -
insert into users values ('summer',18);
:向表users
中插入数据
操作以上指令,可以在 ./pg.log 中看到打印的日志
,可以看出,写入的耗时是大于读取的耗时的。
explain select * from users where age = 18;
,然后会打印出:

含义是:在 users 表中进行顺序查找,从第一条扫描到最后一条,直到查找到年龄等于 18 的这一条,返回数据。 explain 是搜索时使用的策略,为
seq scan
,即顺序扫描,将数据库中的所有 rows 从第一行扫描至最后一行。
// 创建一个表,包含字段 serical_no 和 rand,数据类型均为 bigint
create table index_table (
serical_no BIGINT,
rand BIGING
);
// 向表中插入 1000 条数据
insert into index_table select generate_series(1, 1000),(random() * 1000):: BIGINT
可以在日志窗口中查看刚刚创建数据所需要的时间。如果数据量太大,可以适当降低下创建数据的量级。
分别使用两条查询语句尽心数据查询:
select * from index_table limit 10;
-
select * from index_table order by serial_no desc limit 10;
在日志中可查询到,两条语句执行的时间分别是:2.148ms 和 655.199ms。可通过 explain 语句查询在执行两条语句时,计算机到底做了哪些操作。
image.png
可以看出,当添加了 order by 之后,指令的执行时间明显增加。实际在指令的执行中,是先将所有数据进行降序排序,然后再取出其中的10行。目前的数据量级为 1000,可想而知,如果数据量级继续增加,执行时间会相应的增长。
执行指令select * from index_table where serial_no > 1 limit 1;
之后,再执行同样的指令,在日志中可发现,除第一次执行时间较长,第二次及其以后的执行时间都很快,是因为在第一次查询的过程中,已经将查询结果缓存到内存中。
通过以上实践,得出结论第一次查询时间较长。通过索引可将第一次查询时间进行优化。
create index rand on index_table (rand);
,此语句的含义为:将 index_table 按照 rand 创建 index 索引,索引的含义可以类比于字典中的拼音,相近拼音的字会被放在一起。然后可以使用查询语句和 explain 查看第一次查询的时间,有明显的优化,数据量级越大,越明显。
索引,对于有条件的筛选(大于、小于、排序)的查找速度大大增快。索引,提现了计算机系统中的两个原则,一是空间换时间,通过索引,将数据结构化存储,以降低数据查询时间,由于索引的存在,会增大数据存储空间。二是将每次查询的时间均匀的分摊到插入的时间上,索引是一个有序的数据结构,在插入的时候,会对数据进行重新排序,这个排序是比较耗时的,但是由于排序后的数据对于数据查询能够提高查询速度,所以在首次查询的时候,对于非索引的数据会更快一些。
索引的类型:
- btree 索引:
create index name_age on uesrs (name, age);
将表 users 先按照 name 进行排序,再按照 age 进行排序,其中(name,age, xxx)
可以无限增加 - hash 索引:
create index name_hash on users USING HASH (name);
:用 hash 的方式创建索引,这种索引方式在创建 等于 查询的时候会非常快
总结:
索引,为了解决存储在磁盘中大量数据的快速查找问题而产生的一种特殊的数据结构,作用是使查找更加高效快速。实现原则:1.空间换时间 2.查询时间转移到创建时间。
以上,只是学习过程中做的笔记,因为对数据库存在很多不理解之处,可能存在很多问题,望见谅。
网友评论