paopao-ce 是使用Golang技术栈打造的一个清新文艺的微社区,编译后的可执行文件外加一个配置文件conf.yml
就可以简单部署一个节点实例提供类似Twitter的推文服务。
paopao-ce的配置文件中有一个功能项的配置用于自定义节点实例运行时提供哪些服务,对部署运维非常友好。本文简单解析conf.yml
中功能项配置的设计,了解其背后的实现细节。
conf.yml
的功能项配置机制是参考Rust包管理工具Cargo的 Cargo.toml
中 [features]
配置而设计的。如下示例:
[package]
name = "poem"
version = "1.3.50"
authors = ["sunli <scott_s829@163.com>"]
edition = "2021"
description = "Poem is a full-featured and easy-to-use web framework with the Rust programming language."
[features]
default = ["server"]
server = ["tokio/rt", "tokio/net", "hyper/server", "hyper/runtime"]
websocket = ["tokio/rt", "tokio-tungstenite", "base64"]
multipart = ["multer"]
rustls = ["server", "tokio-rustls", "rustls-pemfile"]
native-tls = ["server", "tokio-native-tls"]
openssl-tls = ["server", "tokio-openssl", "openssl"]
static-files = ["httpdate", "mime_guess", "tokio/io-util", "tokio/fs"]
cookie = ["libcookie", "chrono", "time"]
session = ["tokio/rt", "cookie", "rand", "priority-queue", "base64"]
embed = ["rust-embed", "hex", "mime_guess"]
xml = ["quick-xml"]
i18n = [
"fluent",
"fluent-langneg",
"fluent-syntax",
"unic-langid",
"intl-memoizer",
]
MySQL和PostgreSQL的常用语法差异,后续更新中…
%> brew install postgres
%> psql -version
%> # 若之前安装过,请确保/usr/local/var路径下无任何postrges相关文件残留
%> initdb --locale=C -E UTF-8 /usr/local/var/postgres
%> ln -sfv /usr/local/opt/postgresql/*.plist ~/Library/LaunchAgents
%> # 检查server状态,并确认已开启
%> brew services list
%> brew services start postgresql
%> # mac上新建用户,设置密码并确认
%> createuser postgres -P
%> # 删掉默认的postgres库
%> dropdb postgres
%> # 新建postgres库,若客户端连接报错,有时候需要额外创建跟当前用户同名的库
%> createdb postgres --owner postgres --encoding UTF8 --echo
%> # 进入交互模式
%> psql -U username -d dbname -h 127.0.0.1
0. 什么是直方图
直方图(Histogram)是数据库提供的一种(索引之外的)基础统计信息,用于描述列上的数据分布情况。它最典型的场景是估算查询谓词的选择率,以便选择合适的执行计划。
也就是说,某个列可以不创建索引但创建直方图,也可以帮助提升查询效率。
MySQL 8.0开始支持直方图,这是个很大的进步。
直方图可以针对某个列记录其数据分布统计信息,例如有个列的值是从1到1万,那么可以利用直方图分成100个桶(bucket),每个桶中统计这1万个值是怎么分布的,以及每个桶中的最大值、最小值、占比等信息。
虽然可以利用索引优化SQL效率,但索引维护的代价更高,索引要保持更新,而直方图可以按需手动更新。
索引统计信息也有不可靠的时候,例如存在数据倾斜,或者统计延迟等问题。
另外,在有需要的时候,可以在每个有需要的列上创建直方图,但却不太可能同时创建多个单列索引,那样代价太高了。
例如下面这个执行计划:
[root@yejr.run]> explain select * from t1 where seq = 1234;
+------+---------------+------+---------+------+--------+----------+-------------+
| type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+------+---------------+------+---------+------+--------+----------+-------------+
| ALL | NULL | NULL | NULL | NULL | 299876 | 10.00 | Using where |
+------+---------------+------+---------+------+--------+----------+-------------+
[root@yejr.run]> select * from t1 where seq = 1234;
Empty set (0.097 sec)
在还没创建直方图之前,seq列上同时也没有索引,这时是全表扫描,注意到 filtered 列的值是10%。