
学PostgreSQL不是背SQL敕令,而是搞懂数据在硬盘上怎么喘息的。,它明明没删数据却越用越慢,你还不知说念ctid和VACUUM在悄悄打架?,那条你刚奉行完的UPDATE,其实根底没动正本那行。
我上个月装PostgreSQL,认为和MySQL差未几,建库、建表、INSERT几条数据就算初学了。成果第二天连个浅薄查询皆卡住,查日记全是“lock wait”,psql里输`\d`还清楚“No relations found”,总共这个词东说念主懵了。翻教程说“用pgAdmin点点就行”,可点完还是不会看奉行琢磨,更别说为啥索引建了反而更慢。自后才昭着,不是我手笨,是根底没东说念主告诉我PostgreSQL的行不是“改”,是“生二胎再拉闸”。
第一天我就按大纲配了四件套:开了`log_min_duration_statement = '200ms'`,不是图省事设成0,因为试过一次——日记刷屏,磁盘平直写满。装了`pg_stat_statements`,第一次看到我方写的SQL排在“平均耗时TOP3”,脸皆红了。还用`--data-checksums`重装了一次集群,天然多花了二颠倒钟,但上周硬盘真出了一次坏说念,它就地报错,没让数据静默损坏。这些不是哲学设立,是实打实的保命开关。

psql那几个反斜杠敕令,我练了整整三天。`\d+`比pgAdmin的“刷新表结构”快十倍,还能看到索引占些许MB;`\watch 5`让我亲眼看着一个长事务卡在`idle in transaction`里,终末发现共事忘写COMMIT;`\gexec`更绝,一条敕令批量给三十张表加主键,无谓写shell剧本。现时我连Windows下皆用不时员权限开psql,否则`ALTER USER`改不了密码,总是报“FATAL: password authentication failed”,其实就差那一句`sudo -u postgres`。
查慢查询我不再瞎EXPLAIN。先看`Buffers: shared hit=1200 read=8`,发现read太高,诠释缓存没喂饱;再翻`pg_stat_statements`,发现归拢条SQL被调用了1700次,mean_time却只须3ms——正本不是它慢,是我代码里轮回查了上千次;终末看`Rows Removed by Filter`,2000行里只留3行,凯发官网坐窝去建复合索引。没这三步,光加索引只会让写入更卡,表空间暴涨。

索引我每月手动扫一遍。跑`SELECT * FROM pg_stat_all_indexes WHERE idx_scan = 0`,揪出五个从没被用过的索引,删掉省下4GB空间。还发现存个索引占了12GB,点开看正本是给JSON字段建的宽泛btree,改成`gin`后体积缩到1.3GB,查询快了六倍。所谓“健康自检”,等于如期动刀子,不是贴膏药。
测试环境我也换了活法。以前用pgAdmin还原备份要22分钟,现时`pg_restore --jobs=4 --no-owner`,5分半贬责。上周末团队作念PR,DBLab平直给我生成一个闲静数据库分支,改表结构、删数据、致使误删整张用户表,关掉窗口就隐藏,不影响任何东说念主。AI写的SQL我也全扔进分支跑一遍,真有DELETE没WHERE的,坐窝阻扰,没让它碰坐蓐库半根手指头。
BG真人(BigGaming)官方网站
避坑那张表我打印贴在清楚器边。`psql: FATAL: password authentication failed`?不是密码错了,是Windows办事没重启;`\d`没反映?先`\c mydb`,不是库名写错,是根底没切夙昔;INSERT慢?约略没主键,加个`ALTER TABLE x ADD PRIMARY KEY (id)`立马不卡;查不到最新数据?望望我方还在事务里没`COMMIT`,`psql`里输`\set AUTOCOMMIT on`,从此告别手抖失联。
第六个月我导出过两次全量备份,用`pg_dump -Fc -j 4`,还原时用`pg_restore -d newdb -j 4`,比之前快一倍不啻。还试着用`pg_rewind`把一台备库拉回主库情状,总共这个词经由没停办事。最爽的是给一张百万级订单表作念`VACUUM FULL`,之前查文档吓得不敢动,自后照着大纲查`pg_stat_all_tables`阐明了`n_dead_tup`上万,才动手,腾出32GB空间。

学PostgreSQL最难的不是记敕令,是改掉“数据可唐突改”的直观。它把每行数据当命通常供着,改是生新行,删是贴封条,清垃圾还到手动叫VACUUM。你越把它当活物养,它越不给你甩色彩。
这玩意儿没那么神,但真得摸透它才敢上手。
凯发娱乐(K8)官方网站