战城南——李白

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

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

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

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

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

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

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

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

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

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

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