pymongo保存snappy压缩数据

在使用python snappy压缩以后的数据,保存到mongo时报字符串编码错误,错误内容和下面的差不多:

bson.errors.InvalidStringData
strings in documents must be valid UTF-8

这时候可以使用bson binary格式来保存这类数据:

以上,希望能对你起到帮助。

关于redis的传输协议

很久之前就想写这篇,但是因为时间问题一直也没有弄,先粗糙整理一篇。

redis的传输协议(RESP)

redis的协议总体算比较简单,第一个符号表示回复的类型:

"+" 表示是一个简单字符串,一般都是状态消息,比如输入PING命令
"-" 错误返回使用减号,比如输入一条错误命令
":" 返回数字,比如使用INC命令
"$" 表示返回一条字符串安全的字符串,最长512M,比如使用GET命令
"*" 返回的是一组数据,比如使用SMEMBERS命令

如果是"+"、"-"或者":"后面紧跟着消息体,然后跟一个CRLF,CRLF其实就是"\r\n",消息结束。

[+-:]<msg>CRLF

比如:

  •  +PONG\r\n
  • -unknow command 'foobar'\r\n
  • :10\r\n

剩下的两个个形式在第一个符号后面跟着对应的长度表示,然后是CRLF,接着是消息体表示,最后CRLF结尾:

[$*]<LEN>CRLF<BODY>CRLF

这里的<LEN>如果是结果是字符串则表示字符串长度,如果是一组数据则表示元素个数。<BODY>是消息体,如果是字符串则表示字符串长度,如果是一组数据则使用对应的单条数据的表示形式填充(:|$等数据)。如果长度是-1则表示没有这条数据。比如:

  • $6\r\nfoobar\r\n
  • $-1\r\n
  • *0\r\n
  • *2\r\n$3\r\nfoor$3\r\nbar\r\n
  • *5\r\n:10\r\n$-1\r\n$3foor\r\n

redis协议可以参考这篇文档:redis protocol

这里还有篇中文的:通信协议

继续阅读

mysq使用like查找有反斜杠的数据

不知道什么时候记录的这条了,一直也没发布。

这里的重点是使用like binary,而且使用了四个反斜线。

具体可以参考下面的地址:

http://stackoverflow.com/questions/8583144/mysql-like-operator-with-wildcard-and-backslash

mysql5.5的默认字符集配置

最近有些糊涂,完全忘记去看error日志或者debug信息。

昨天弄mysql的时候怎么也起不来,把我郁闷的直接给卸载掉不管它了。今天又想安装上,于是弄上去发现还不行。那就编译吧,用老配置文件——结果还是不行……瞟了一眼错误信息——“default-character-set=utf8”它居然不认……上网一查,好家伙,mysql5.5不支持这货了,那就把原来的删掉,把下面这句加到[mysqld]里面,又起来了,不容易……

character-set-server=utf8

进到mysql里打个“\s”一看,字符集全utf-8了。

以后一定要看debug的消息啊……

优化 MySQL 语句的十个建议

看到OSCHINA上转的这篇,觉得不错,留下来做个备份。

Jaslabs的Justin Silverton列出了十条有关优化MySQL查询的语句,我不得不对此发表言论,因为这个清单非常非常糟糕。另外一个Mike也同样意识到了。所以在这个博客中,我要做两件事情,第一,指出为什么这个清单很糟糕,第二,列出我的清单,希望我的比较好些。继续看吧,无畏的读者们!

(译者注:作者借这个题目反讽另一篇同名的文章)

为什么那个清单很糟糕

1.他的力气没使对地方

我们要遵循的一个准则就是如果你要优化代码时,应该先找出瓶颈在哪。然而Silverton先生的力气没有用对地方。我认为60%的优化是基于清楚 理解SQL和数据库基础的。你需要知道join和子查询的区别,列索引,以及如何将数据规范化等等。另外的35%的优化是需要清楚数据库选择时的性能表 现,例如COUNT(*)可能很快也可能很慢,要看你选用什么数据库引擎。还有一些其他要考虑的因素,例如数据库在什么时候不用缓存,什么时候存在硬盘上 而不存在内存中,什么时候数据库创建临时表等等。剩下的5%就很少会有人碰到了,但Silverton先生恰好在这上面花了大量的时间。我从来就没用过 SQL_SAMLL_RESULT。

继续阅读

mongodb索引讲解与性能调优

转自http://ptc.35.com/?p=214

mongodb索引规则基本上与传统的关系库一样,大部分优化MySQL/Oracle/SQLite索引的技巧也适用于mongodb。

一、 为什么用索引:

当查询中用到某些条件时,可以对该键建立索引,以提高查询速度。

如果数据量很多且查询多于更新时,可以用索引提高查询的速度。

继续阅读

关于MYSQL的on duplicate key update

有些时候我们需要插入数据库的时候,遇到唯一的键值希望更新而并非引发错误,这样就可以保持数据库中的数据在不重复的同时保持到最新。这时我们就可以使用on duplicate key update语句。这条语句是这样规定的:

比如我们希望向table中的a, b, c三个列添加数据1, 2, 3 ,结果已经这个表中的a, b, c中一个是主键或者是UNIQUE INDEX这种唯一键值,且恰表里面有这个值了(也就是可以触发唯一的键值重复),这条语句便会执行update后面的子句了。当然,如果没触发唯一键值的重复,自然就要执行Insert语句了。

从程序上给人的感觉就是如果触发了UNIQUE异常,则catch到这个异常,然后执行update语句。

使用这条语句的时候,有几个方法可以用到。我们看到语句里面写的"c = c +1",就是说可以使用列名来表示原来的值。如果你希望引用现在的值怎么办呢(就是说c = 3),你当然可以写作c = 3, 还有一种方法是使用values(c)来表示使用你希望插入的值进行更新。通知,这条语句支持插入多条数据。下面是一个例子:

继续阅读