paopao - 关于功能项配置解析的设计

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",
]

战城南——李白

  去年战,桑干源,今年战,葱河道。

  洗兵条支海上波,放马天山雪中草。

  万里长征战,三军尽衰老。

  匈奴以杀戮为耕作,古来唯见白骨黄沙田。

  秦家筑城避胡处,汉家还有烽火燃。

  烽火燃不息,征战无已时。

  野战格斗死,败马号鸣向天悲。

  乌鸢啄人肠,衔飞上挂枯树枝。

  士卒涂草莽,将军空尔为。

  乃知兵者是凶器,圣人不得已而用之。

Mac通过brew本地安装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

MySQL 8.0直方图

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%。