测试

March 2nd, 2010 by justlooks

此博客不再更新

February 20th, 2010 by justlooks

新博客轉到 這裏

AWK脚本一個

February 5th, 2010 by justlooks

今天有同事提了個需求在众多目录下挑选出每月第1个备份目录,目录是日期格式(YYYY-MM-DD),每月第1个目录是不规则的(可能是2009-10-01,也可能是2009-10-02)

脚本如下

#cat aa

#!/bin/awk -f

BEGIN {
mflag=0
}
{
match($2,/^0/)?nowm=substr($2,2):nowm=substr($2,1)
if(mflag==nowm){
next
}
if(mflag!=nowm){
print
mflag=nowm
}
}

运行命令为

ls |grep -P “\d+”|awk -F’-’ -f aa

在mysqlsandbox中安装 mariadb

February 4th, 2010 by justlooks

下载  mariadb-5.1.42-Linux-i686.tar.gz,做个软连接,改个名字,不然make_sandbox不认

ln -s mariadb-5.1.42-Linux-i686.tar.gz mysql-5.1.42-Linux-i686.tar.gz

然后运行make_sandbox

make_sandbox /root/mysql-5.1.42-Linux-i686.tar.gz –sandbox_directory=mariadb  –upper_directory=/data/mysql_sandboxes -P 5566

提示无法把解压的文件改名,手动改一下就可以了

mv mariadb-5.1.42-Linux-i686 5.1.42

然后再重新运行make_sandbox

顺利启动

Server version: 5.1.42-MariaDB (MariaDB - http://mariadb.com/)

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

mysql [localhost] {msandbox} ((none)) > select version();
+—————-+
| version()      |
+—————-+
| 5.1.42-MariaDB |
+—————-+
1 row in set (0.00 sec)

删除名字有空格的表

February 2nd, 2010 by justlooks

mysql>drop table `aa 11`;

用TCPDUMP抓取未使用索引的查询

January 26th, 2010 by justlooks

tcpdump -i eth0 port 3306  -s 65535 -x -n -q -tttt|mk-query-digest –type tcpdump –filter ‘($event->{No_index_used}||$event->{No_good_index_used})’

查看输出

# Profile
# Rank Query ID           Response time    Calls R/Call   Item
# ==== ================== ================ ===== ======== ================
#    1 0×261703E684370D2C     0.0157 95.1%     1   0.0157
#    2 0xF82CB7DB401F5A6E     0.0008  4.9%     1   0.0008 SELECT test.test_backup

关于sphinx索引数据更新问题的解决

January 21st, 2010 by justlooks

试了下sphinx,不久就发现有个问题,也就是不变的索引和变化的数据之间对立的问题,根据文档,sphinx是这样解决这个矛盾的,相对于少量变化的数据,大部分数据是不变的,这样把大多数数据装入主索引,而变化的数据装入增量索引,而文档中区分是否是增量数据是根据ID判断的,也就是到某个时间点主索引重新建立时计算这个时间点的数据库记录最大数,保存到一个辅助表中,而增量索引的重建是根据这个最大数为判断下限,来取变动的数据,这样对于插入删除是没有问题的,但是对于更新操作则会带来奇怪的问题,比如我更新了一个记录的查询字段值,那么这个字段或者被新包含到某个查询的结果集,或者是被某个查询的结果集合排除,而对于不变的主索引,无法检测到这个变动,而对于增量索引同样无法包含变动后的记录(因为ID)结果是,当更新数据后再次查询,本来应该被结果集排除的记录仍旧存在于中,本来应该新纳入结果集的还是无法被包含,根据网上的资料和实际实验,我给出以下方法,来部分解决这个问题。

1,对于主索引sphinx应该需要是否一条记录被更新,以从检索中排除。

2,对于增量索引,应该能包含主索引中的更新后的记录

这样设置新的辅助表为

+————-+———+——+—–+———+——-+
| Field       | Type    | Null | Key | Default | Extra |
+————-+———+——+—–+———+——-+
| counterid   | int(11) | NO   | PRI | NULL    |       |
| update_time | datetime    | YES  |     | NULL    |       |
+————-+———+——+—–+———+——-+

update_time字段记录主索引建立时间

编辑主索引数据源为(在索引中增加is_dirty字段来检测记录是否被改变,在索引建立后更新辅助表)

sql_query       = \
SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content,1 as is_dirty FROM documents
sql_query_post = REPLACE INTO search_counter SELECT 1,NOW();

编辑增量索引数据源(增量记录取舍根据表的附加字段date_added时间与辅助表时间比较)

sql_query                               = \
SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content,1 as is_dirty FROM documents WHERE date_added > (SELECT update_time FROM search_counter WHERE counterid=1)
另外在增量索引和主索引中都需要声明is_dirty的属性

对于更新操作需要做的是调用API的UpdateAttributes方法来更新is_dirty的值(比如1为未更新,2为更新)

更新数据库的相应记录的date_added时间,

这样主索引通过API的SetFilter方法来排除更新的记录,增量索引在重建时通过时间比较来包括更新的记录.

对于单表建立索引,这种方法可行,但是对多表联合的复杂情况可能要具体问题具体分析了。

中文分词的解决办法

January 15th, 2010 by justlooks

通过使用sphinx来做全文检索发现一个问题,比如我要在一个列字段中查找含有”系统”的关键字,但是通过查看结果发现只找出”XXX 系统”或者”XXX(系统)”

而对于”XXX系统”却查不出来,网上搜索了一下找到了解决的办法,在索引定义段中添加如下字段

ngram_len                = 1
ngram_chars              = U+4E00..U+9FBB, U+3400..U+4DB5, U+20000..U+2A6D6, U+FA0E, U+FA0F, U+FA11, U+FA13,\
U+FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27, U+FA28, U+FA29, U+3105..U+312C,\
U+31A0..U+31B7, U+3041, U+3043, U+3045, U+3047, U+3049, U+304B, U+304D, U+304F, U+3051,\
U+3053, U+3055, U+3057, U+3059, U+305B, U+305D, U+305F, U+3061, U+3063, U+3066, U+3068,\
U+306A..U+306F, U+3072, U+3075, U+3078, U+307B, U+307E..U+3083, U+3085, U+3087,\
U+3089..U+308E, U+3090..U+3093, U+30A1, U+30A3, U+30A5, U+30A7, U+30A9, U+30AD, U+30AF,\
U+30B3, U+30B5, U+30BB, U+30BD, U+30BF, U+30C1, U+30C3, U+30C4, U+30C6, U+30CA, U+30CB,\
U+30CD, U+30CE, U+30DE, U+30DF, U+30E1, U+30E2, U+30E3, U+30E5, U+30E7, U+30EE,\
U+30F0..U+30F3, U+30F5, U+30F6, U+31F0, U+31F1, U+31F2, U+31F3, U+31F4, U+31F5, U+31F6,\
U+31F7, U+31F8, U+31F9, U+31FA, U+31FB, U+31FC, U+31FD, U+31FE, U+31FF, U+AC00..U+D7A3,\
U+1100..U+1159, U+1161..U+11A2, U+11A8..U+11F9, U+A000..U+A48C, U+A492..U+A4C6
可以正确查找所需字段,但是在构建索引的时候时间会长很多