转载:http://willko.iteye.com/blog/670120
uuid用binary保存
建议uuid不要使用char来保存,而用binary(16)来保存。这里在长度上来讲用binary会节省一半。因为一个字符占用1个字节,而一个字节实际上可以表示0-256(2^8),用16进制的表示需要2个字节00-FF(0-256)。
优化前:SET uuid = UUID() (类型:char(36))
优化后:SET uuid = HEX(REPLACE(UUID(), ‘-’, ”)) (类型:binary(16))
用crc32替换长字符串的查找
如果索引列是个很长的字符串,例如url。那可以再建立一个列用来保存这个列的crc32结果,以提高索引的使用速度。
优化前:WHERE url = ‘http://willko.iteye.com/’ (索引:url,类型:var/char(?))
优化后:WHERE url_crc32 = CRC32(‘http://willko.iteye.com/’) AND url = ‘http://willko.iteye.com/’ (索引:url_crc32,类型:unsigned int)
前缀索引和后缀索引
前缀索引听得比较多,优点是减少索引的长度,缺点是排序不能使用前缀索引(影响distinct/order/group),也不会出现Covering Index(只读取索引就能满足查询)。
后缀索引还是首次听到,孤陋寡闻了。因为MySQL不支持反向索引,所有有时候查询会有问题,例如字段blog保存用户的博客地址(http://willko.iteye.com),那需要查询某个域名有多少个用户就不好查询,可以用一个额外的字段反转保存。blog_reverse:moc.eyeavaj.willko://ptth,这样就很容易查到iteye.com(moc.eyeavaj)有多少用户了,并可以使用索引,也就是解决了 LIKE ‘%?’的问题,因为查询反转成LIKE ‘?%’了。
散列数据
散列数据就是把原本只有一条记录的散列成多条,充分利用InnoDB行锁的特性,提高并发。
例如,之前是UPDATE hit_counter SET cnt = cnt + 1 [...]
看看问题
我在做这样一个测试:架设 Replica Set,有 3 个节点,运行于同台机器的3个不同端口。使用 PHP 往里面不停地以每次插入 10000 个文档,一共需要插入 1E 左右个文档。
在插入中,2 个 SECONDARY 全部状态为 Recovering,错误信息:”errmsg” : “error RS102 too stale to catch up”。并且在插入7000W左右文档时(并不表示在 7000W 数据后才发生),发现插入速度变的很不稳定:
>mongo insert in 2.1298868656158 Secs. memory 164.25 MB
>mongo insert in 61.71651506424 Secs. memory 164.25 MB
>mongo insert in 2.6970100402832 Secs. memory 164.25 MB
PHP:PHP 5.3.6 (cli) (built: Jun 15 2011 16:29:50)
MYSQL:5.1.51
如果我们有的一张表有几百万或几千万的记录,我们要使用 PHP 将所有的记录都获取过来(遍历数据表)进行处理。查询语句:
1
SELECT * FROM largetable;
PS:为了证明上面的做法是最佳的办法,我尝试使用 largetable 中的一个字段做 where ,以及 LIMIT,OFFSET 。上面那种 WHERE 获得结果很慢,虽然用了索引。后面这种 LIMIT 可以让你有一种想死的感觉(有兴趣可以了解下,《分页优化》)。
以 MYSQL 以及PDO_MYSQL 为例,尝试直接使用以下代码,必然会出现超内存的情况:
1
2
3
$result = mysql_query($sql);
while ($rowset = mysql_fetch_assoc($mysql)) {
… 1
2
3
4
$stmt = $dbh->prepare($sql);
[...]
今天要复制个数据库,就是把 MYSQL 实例下的一个数据库复制到该实例下。
数据表有~250张左右、数据~2500 W,原始数据(在没建立索引的情况下)~4G。在 http://stackoverflow.com/ 上找了一个 SHELL 脚本,分享下。
修改以下参数,使用 sh ./mysql-copy_database.sh 运行即可
DBUSER=user #数据库帐号,root ?
DBPASSWORD=pwd #数据库密码 123123 ?
DBSNAME=sourceDb #复制源数据库名 wordpress ?
DBNAME=destinationDb #复制目标数据库名 wordpress_copy ?
DBSERVER=db.example.com #数据库地址 127.0.0.1 ?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
今天细读 PHP MONGO 文档时发现原来MONGO也存在注入攻击呵呵。
看来写操作 MONGO 的时候也要注意了。
参考:
http://php/manual/zh/mongo.security.php http://www.idontplaydarts.com/2010/07/mongodb-is-vulnerable-to-sql-injection-in-php-at-least/
Phil 的一个简单解决办法是将其强制转换成字符串,那么如果通过GET/POST等请求过来的参数就不会出现类似 ["$ne"]=> string(3) “foo” 的注入了。
The solution is to ensure your variables are properly typed before they are passed into the MongoDB driver. The following code is not vulnerable to MongoDB injection:
1
2
3
4
$collection->find(array(
[...]
测试性的将1千3百万的数据导入了MONGO,主要对昵称字段做了下索引,等待一段时间后出现:
removed == 1 + _files.size()
并且索引也未添加。查询官方和GOOGLE无任何结果。很郁闷阿。开始是怀疑昵称可能是含有中文等特殊符号的原因,后来又对邮箱做索引一样出现提示,索引也未添加的情况。
因此再测试性的生成了 1千万的数据,字段为 random 随即 0 -16 长度的字母和数字。也出现上面的提示,但索引被创建了。具体出现该问题的原因未知,内存未被耗尽,磁盘空间也还有。
总结:看来在数据迁移进 mongo 的时候要先建索引再进行数据导入。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
> db.large.find({random:’q6fv7a1qkJ’}).explain()
{
"cursor" : "BtreeCursor random_1",
"nscanned" : 1,
[...]
如果我们同时调用了多个页面(比如用IFRAME或用PHP程序输入图片),并且这些页面都使用了 SESSION 储存一些数据。
这样悲剧的事情就来了….
SESSION 的储存
默认情况下PHP-SESSION储存的时候,是将$_SESSION 数组的数据一起保存到文件中(当然可以配置 PHP.INI 到MEMCACHE或自己通过 session_set_save_handler 储存到其他地方)。然后使用 SID 作为 KEY,自然 VALUE就是$_SESSION 的数据。
悲剧的问题
如果我们同时执行了3张网页,这3张网页网页都使用了PHP-SESSION 保存数据:
1. 保存 $_SESSION['test1'] = ‘test1′;
2. 保存 $_SESSION['test2'] = ‘test2′;
3. 保存 $_SESSION['test3'] = ‘test3′;
我们理想的结果是 test1、test2、test3 在任何情况下都应该被保存。但事实不是这样的。
假如他们是同时读取的,并且 test3 是在最后被保存。那么 SESSION 保存的数据就不是 test1、test2、test3 这三个数据了而是 test3这一个数据。导致这个问题的原因是,SESSION储存的时候是将数据一起全部保存的。于是导致了覆盖。
由于服务端执行顺序的不同,也可能得到这样的结果:
Array ( [test2] => [...]
今天同事遇到了和我前几天相似的问题, MongoDB 无法启动。于是先看了下日志,和我之前遇到的问题一样。有这么一句话:
_LIB_VERSION=1_43
**************
old lock file: /usr/local/www/mongodb/mongod.lock. probably means unclean shutdown
recommend removing file and running –repair
see: http://dochub.mongodb.org/core/repair for more information
*************
按照建议删除掉 /usr/local/www/mongodb/mongod.lock 文件就可以启动了。mongod.lock 储存于 mongo 的数据所在目录下。
转载:http://blog.csdn.net/hbcui1984/archive/2010/01/03/5125387.aspx
在shell开发中,很多时候我们需要操作mysql数据库(比如:查询数据、导出数据等),但是我们又无法进入mysql命令行的环境,就需要在shell环境中模拟mysql的环境,使用mysql相关命令,本文总结几种shell操作mysql的方法,供大家参考。
方案1 1
mysql -uuser -ppasswd -e"insert LogTable values(…)"
优点:语句简单
缺点:支持的sql相对简单
方案2
准备一个sql脚本,名字为update.sql,例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE TABLE `user` (
`id` VARCHAR(36) NOT NULL COMMENT ‘主键’,
`username` VARCHAR(50) NOT NULL COMMENT ‘用户名’,
`password` VARCHAR(50) [...]
在老外的站点上看到非常不错的 Explode 存储过程实现。为了能方便处理 SELECT 出来的结果集字段(select lib_Explode(‘,’,string) from xxx; ),我改了一个 FUNCTION ,基本上是一样的。但需要将里面建表的语句单独拿出来。
EXPLODE 方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
DROP TABLE IF EXISTS lib_Explode;
CREATE TABLE lib_Explode(
[...]
實用技術博客,分享、討論實際工作中的一些問題和經驗
茉莉花~
有那麽一堆人,把道德和文化都丟棄了,還自稱5千年文明,可笑。
歡迎一起討論 OSX 下的程序開發、軟件應用等;WINDOWS 下的競技遊戲近期评论
- nroe 发表在《It’s Brain 后台管理UI》
- 桉叶 发表在《It’s Brain 后台管理UI》
- Paul 发表在《留言板》
- nroe 发表在《ZendStudio OSX 下啟用 JAVAHL》
- nroe 发表在《MAC 下使用 MACPORT 安裝 PHP-FPM》
标签
.SVN 80后 AJAX Android APACHE array aspersa AWE41AP BSD BUFFLAO character CHROME dns freebsd GOOGLE Javascript MAC MACPORT MAIL MMSEG4N MongoDB MySQL NAS NGINX NODEJS OSX OSX Password-Strength phing PHP Replica-SET REWRITE SESSION SHEEL SHELL TIMEMACHINE UPLOAD XDEBUG ZendFramework 中国特色 域名 存储过程 安全 搞笑 漫画日和链接表
- 01. Eric's linux and nginx 杨振亮一直从事linux 负载均衡,存储等工作
- 01. 叶茂盛 YeMaosheng’s Blog(软件开发、系统管理)
- 01. 威同学的博客 疯狂痴呆傻,美甘苦涩禅
- 01. 翡翠’s 板报 纪录自己的生活、工作和学习
- 01. 阿冬的 I-T 厨房的博客
- 01. 风雪之隅 PHP 的文章比较多,偶然看看[推荐下]
- 02. 新普IT教育(培训)
- 02. 若寒小记
- 10. Ayou 服务器系统架构分析日志 网易 Ayou,博客很简洁,内容精彩
- 10. Cats Who Code a website dedicated to those who create and maintain websites
- 10. David Walsh Blog MooTools Dev, JavaScript FanBoy, CSS Experimenter, and TPS Reporter
- 10. Web App Security
- 10. 大罗-PHP/Python博客
- 99. CodeColorer wordpress 代码加亮插件
- 99. stackoverflow.com 专业技术问答网站
文章归档
- 2012 年五月 (1)
- 2012 年三月 (1)
- 2012 年二月 (17)
- 2012 年一月 (6)
- 2011 年十二月 (9)
- 2011 年十一月 (7)
- 2011 年九月 (4)
- 2011 年八月 (11)
- 2011 年七月 (27)
- 2011 年六月 (20)
- 2011 年五月 (9)
- 2011 年四月 (10)
- 2011 年三月 (3)
- 2011 年二月 (3)
- 2011 年一月 (22)
- 2010 年十二月 (18)
- 2010 年十一月 (2)
- 2010 年十月 (6)
- 2010 年九月 (18)
- 2010 年八月 (6)
- 2010 年七月 (3)
- 2010 年六月 (2)
- 2010 年四月 (1)
- 2010 年三月 (7)
- 2010 年二月 (11)
- 2010 年一月 (8)
- 2009 年十二月 (4)
- 2009 年十一月 (4)
- 2009 年十月 (4)
- 2009 年八月 (5)
- 2009 年七月 (21)
