MySQL和PostgreSQL的常用语法差异
MySQL和PostgreSQL的常用语法差异,后续更新中…
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
直方图(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%。