主要用了俩命令:
vacuum full tablename; 能释放表空间
VACUUM ANALYZE search_history; 根据统计信息优化sql执行
Read more...
Archive for postgresql
sphinx/coreseek配置postgresql增量索引
新创建一个表保存最大id,区分主索引和增量索引
# 搜索索引相关
CREATE TABLE index_delta (
id SERIAL PRIMARY KEY,
max_id integer
);
INSERT INTO index_delta (id, max_id) VALUES (1, 0);
我这里直接插入数据,后边配置的时候直接使用update就行了,不然太麻烦。
配置文件;先大体测试了一下,应该没什么问题了,安装的3.2版本的coreseek,好多功能没有,不过够用了,先布置到线上看看效果
Read more...
source main { type = pgsql sql_host = localhost sql_user = pgsql sql_pass = sql_db = bt sql_port = 5432 # optional, default is 3306 sql_query_pre = SET NAMES 'UTF8' sql_query_pre = UPDATE index_delta set id=1, max_id=max FROM (SELECT MAX(id) AS max FROM hash) AS foo; sql_query_range = SELECT MIN(id),MAX(id) FROM hash sql_range_step = 1000 sql_query = SELECT id, hash, extract('epoch' FROM insert_time)::int AS date_added, name, files \ FROM hash WHERE id>=$start AND id<=$end AND id<=(select max_id from index_delta ) # sql_attr_uint = hash sql_attr_timestamp = date_added # sql_field_string = name # sql_field_string = files sql_query_info_pre = SET NAMES utf8 sql_query_info = SELECT * FROM hash WHERE id=$id } source delta : main { sql_query_pre = SET NAMES 'UTF8' sql_query_range = SELECT a.min_id, b.max_id FROM (SELECT MAX(id) AS max_id FROM hash) AS b, \ (SELECT max_id AS min_id FROM index_delta) AS a sql_range_step = 1000 sql_query = SELECT id, hash, extract('epoch' FROM insert_time)::int AS date_added, name, files \ FROM hash WHERE id>(select max_id from index_delta ) AND id>=$start AND id<=$end } index main { source = main path = /usr/local/coreseek/var/data/main docinfo = extern # charset_type = sbcs # rt_field = name # rt_field = files mlock = 0 morphology = none min_word_len = 1 html_strip = 0 charset_dictpath = /usr/local/mmseg3/etc/ charset_type = zh_cn.utf-8 ngram_len=0 } index delta : main { source = delta path = /usr/local/coreseek/var/data/delta docinfo = extern mlock = 0 morphology = none min_word_len = 1 html_strip = 0 charset_dictpath = /usr/local/mmseg3/etc/ charset_type = zh_cn.utf-8 ngram_len=0 } indexer { mem_limit = 64M } index main { source = main path = /usr/local/coreseek/var/data/main docinfo = extern # charset_type = sbcs # rt_field = name # rt_field = files mlock = 0 morphology = none min_word_len = 1 html_strip = 0 charset_dictpath = /usr/local/mmseg3/etc/ charset_type = zh_cn.utf-8 ngram_len=0 } index delta : main { source = delta path = /usr/local/coreseek/var/data/delta docinfo = extern mlock = 0 morphology = none min_word_len = 1 html_strip = 0 charset_dictpath = /usr/local/mmseg3/etc/ charset_type = zh_cn.utf-8 ngram_len=0 } indexer { mem_limit = 64M }sphinx自带python的api接口,在源代码的api目录里,python api/test.py MP4,可以搜索MP4的关键字,测试一下可以用。 看了一眼sphinx.py,就是请求的listen端口。这个后边慢慢研究一下。 >>> import sphinxapi >>> c = sphinxapi.SphinxClient() >>> q = c.Query('world')
freebsd上安装sphinx coreseek postgresql
基本都是coreseek官网提供的命令安装,但是在freebsd上出现很多问题,都是查找解决的。
sh buildconf.sh最后没有生成configure脚本,且提示automake: warnings are treated as errors
在 csft-4.1/buildconf.sh 文件中,查找
&& aclocal \
后加上
&& automake --add-missing \
在 csft-4.1/configure.ac 文件中,查找:
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
改为:
AM_INIT_AUTOMAKE([-Wall foreign])
这里支持pgsql接口
./configure --prefix=/usr/local/coreseek --without-unixodbc --with-mmseg --with-mmseg-includes=/usr/local/mmseg3/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg3/lib/ --without-mysql --with-pgsql --enable-id64
编译的时候出错
sphinxexpr.cpp:1746:43: error: ‘ExprEval’ was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
可以直接修改src/sphinxexpr.cpp文件的1746, 1777和1823行,将三行中的ExprEval改为this->ExprEval
undefined reference to `libiconv'
这个直接采用官方的第三种方法了,为了方便。。
配置完建立索引的时候
source 'src1': unknown type 'pgsql'; skipping.
卧槽 4.1编译完以后一直内存段错误 ,找不到问题。换成稳定版本,libiconv采用第二种方法,成功。
/usr/local/coreseek/bin/searchd -c /usr/local/etc/sphinx.conf启动
加-h查看参数
/usr/local/coreseek/bin/search -c /usr/local/etc/sphinx.conf -a mp4 搜索
明天详细研究一下配置文件
###########
测试完真正安装的时候又报错了。
编译mmseg的时候报错ThesaurusDict.h:12:17: error: expected namespace name
编辑文件:ThesaurusDict.h
在头部找到:#include
再其下加入一行代码:#include
3.2修改src/sphinxexpr.cpp的1080,1013,1047行
Read more...
postgresql插件pg_stat_statements查看慢sql
从网上找到这个插件可以查看postgresql数据库执行的慢sql。于是安装试试,but
先写出文档来http://www.postgresql.org/docs/current/static/pgstatstatements.html
配置文件需要做的更改
# postgresql.conf
shared_preload_libraries = 'pg_stat_statements'
pg_stat_statements.max = 10000
pg_stat_statements.track = all
重启postgresql后,发现报错了“could not access file "pg_stat_statements": No such file or directory”。从网上也没找到问题,群里问也没说的。然后慢慢查postgresql插件的资料,发现我freebsd机器插件目录里没有这个插件。/usr/local/share/postgresql/extension
然后我看了pkg的包资料,发现应该是少装了一个包,
pkg info | grep postgresql
安装之,修改配置文件,重启。这次正确重启了。然后
create extension pg_stat_statements;
\dx查看 多了一个pg_stat_statements.成功了。我的程序一直在跑,然后直接就查这个表就能看到数据。给力的功能。
这个是官方给的sql查询的,我觉得看单次最大时间,和单条平均时间还是有用的。哈哈,这个看了还要再算一下。
清空数据:SELECT pg_stat_statements_reset();
Read more...
postgresql常用命令总结1
//\加上字母l,相当于mysql的,mysql> show databases; \l//以KB,MB,GB的方式来查看数据库大小 select pg_size_pretty(pg_database_size('playboy'));//相当于mysql的,mysql> show tables; \dt//以KB,MB,GB的方式来查看表大小 select pg_size_pretty(pg_relation_size('test'));//查看表的总大小,包括索引大小 select pg_size_pretty(pg_total_relation_size('test'));//查看所有表空间 select spcname from pg_tablespace;//查看索大小 select pg_size_pretty(pg_relation_size('playboy_id_pk')); 哈哈 这里我查了一下表数据80M,一个全文检索索引230M。//查看表空间大小 select pg_size_pretty(pg_tablespace_size('pg_default'));
Postgresql获取插入的自增id
declare id_r integer;
SELECT currval('haha_id_seq') INTO id_r;
我是写了一个类似mysql 中 ON DUPLICATE KEY UPDATE的功能function,所以选则了这种方法。有重复记录就返回0,没重复记录就返回插入的id。
其实在数据库中执行\d 可以看到有自增id会出来一个表xx_id_seq,表里就一条数据,记录了id的相关数据。
Read more...
freebsd安装postgresql
折腾了好长时间,重新初始化好多次。
安装的时候,命令:pkg search postgresql.额 好多包,选择最新的9.4安装server,会一起安装client。安装完会有很多文字提示,这个很有用。安装完会新建一个用户pgsql,家目录为/usr/local/pgsql.
第一步,
要先切换到pgsql用户下,su root, su pgsql。然后在pgsql home目录创建data文件夹。root用户下好像是不允许的
初始化,initdb -D /usr/local/pgsql/data/ ,会生成很多文件。初始化数据库存储区,会自动创建一个 postgres的数据库,放乱七八糟的设置和第三方插件的数据。还会有一个模板 template1。这里还不是很清楚,以后创建数据库就会用这个模板创建。这里要说的是数据库编码的问题,这里悲剧的初始化了好多次。
默认执行上边的命令后,提示文字会跟你说(当时没看。。)默认数据库编码为“sql_ascii”,默认文本搜索设置为 english。。我靠执行的时候就瞅着屏幕发呆了,就等执行完。。。重新初始化的方法,我也是从提示中看到的,直接initdb会提示你 要清空原来文件夹或者新建。直接rm -rf *.initdb --help
可以看到字符编码的设定用--encoding ,initdb --encoding=UTF8 -D /usr/local/pgsql/data/
启动postgresql,启动脚本/usr/local/etc/rc.d/postgresql。开始要添加到/etc/rc.conf文件,这个也是有提示的。
status not running,start成功
创建数据库,createdb --encoding=UTF-8 bt,使用客户端连接,qsql bt,
进去后 show server_encoding;查看server编码,utf8
\encoding 查看客户端编码。客户端还是SQL_ASCII,可以使用/encoding utf8改变客户端编码。
也可以直接使用\l查看。
ok了 基本没别的问题了。
Read more...