作者:老王

以产品为中心的网站URL

URL设计是个很有讲究的问题,很多网站在这方面显得过于随意。

比如说我们有一个照相机网站,数据库里保存着canon 550d,其id是123,那举一个不好的例子:

http://www.foo.com/pictures/123.html
http://www.foo.com/comments/123.html

为什么说这些URL不好,看看下面的URL设计:

http://www.foo.com/123/pictures
http://www.foo.com/123/comments

这样就好多了,为什么这么说呢,因为对一个产品网站来说,产品是中心,URL的设计无疑应该以产品为中心来设计,而且URL本身就是有层次的,所以善用这种层次就会让网站URL更有条理性。否则如开始那样设计URL就变成以功能为中心来设计URL了,而不是以产品为中心。

不过我们还能做得更好,比如:

http://www.foo.com/canon/550d/pictures
http://www.foo.com/canon/550d/comments

抛弃id这种索然无味的标识符,采用更具语义的品牌名字和型号名字,会得到更友好的URL。

因为这样更有层次感:canon品牌中550d型号的图片(评论),不管是对浏览者而言,还是对搜索引擎而言,这种层次感都更简单易懂。

URL设计相关文章:

关于 URL 的一些不可不知的知识
Guidelines for URI Design

Write mysqlnd plugins in PHP

这算是最近最Coooool的一个新闻了,借助一个PECL扩展mysqlnd_uh,用PHP写Mysqlnd插件,不再有C语言门槛,这意味着你可以用PHP代码实现类似MySQL Proxy的功能,非常有诱惑力。详细信息参见PHP @ FrOSCon: the power of mysqlnd plugins

MySQL衍生版本

1:Percona Server
2:MariaDB
3:Drizzle

MySQL按时间点还原

如果是通过mysqldump备份备份的话,以InnoDB为例,命令大概如下:

mysqldump --all-databases --single-transaction --flush-logs --master-data=2 ...

这里的master-data很重要,这样可以在备份文件里生成类似下面的语句:

CHANGE MASTER TO MASTER_LOG_FILE='...',MASTER_LOG_POS=...;

在还原的时候,就可以通过MASTER_LOG_FILE和MASTER_LOG_POS确定二进制日志的起始位置:

mysqlbinlog --start-date=... --stop-date=...

命令里的flush-logs也是必要的,这样可以生成新的日志文件,查找起来就方便多了。

注意:flush-logs有副作用,如果你没有做好错误日志的备份,那么多次flush-logs后,错误日志会丢失。

Linux下查看硬盘信息


dmesg命令结果里有硬盘信息,但是太乱了,不容易查看。

如果是SCSI硬盘:

# cat /proc/scsi/scsi
Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
Vendor: MAXTOR   Model: ATLAS10K5_147SAS Rev: BMU6
Type:   Direct-Access                    ANSI SCSI revision: 05
Host: scsi1 Channel: 00 Id: 00 Lun: 00
Vendor: TEAC     Model: DVD-ROM DV28SV   Rev: D.0J
Type:   CD-ROM                           ANSI SCSI revision: 05

如果是IDE硬盘,估计很少有网站会用,但记一下命令也是值得的:

# find /proc/ide/ide[0-9]/hd? -type f -name model -exec cat {} \;

经过网友提示,还有一个smartctl命令可以查看硬盘信息:

# smartctl -i /dev/sda
smartctl version 5.38 [x86_64-redhat-linux-gnu] Copyright (C) 2002-8 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

Device: MAXTOR   ATLAS10K5_147SAS Version: BMU6
Serial number: J4H05LFK
Device type: disk
Transport protocol: SAS
Local Time is: Mon Aug 23 11:05:50 2010 CST
Device does not support SMART

MySQL与GUID(UUID) COMB

在这里,我把GUID,UUID两个名词看做一样的东西,都是指一个唯一ID。

GUID(UUID)大家并不陌生,但是GUID COMB就不是很常见了。最初的概念由Jimmy Nilsson提出。先看看GUID(UUID),在MySQL里多数人似乎不喜欢使用它,主要原因在于InnoDB的影响:

1:InnoDB是聚集主键,也就是说数据要按照主键物理排序,由于GUID(UUID)的无序性,会打来巨大的磁盘IO操作。
2:InnoDB中非主键索引都包含主键,GUID(UUID)本身都很长,所以索引也会变大。

其中主要瓶颈集中在第一个问题上,至于第二个问题,还可以忍受。

正是为了解决第一个问题,于是出现了GUID(UUID) COMB,对于COMB类型的GUID(UUID)来说,它在保持唯一性的前提下,并不是完全无序的,大体上有一定的顺序性,如此一来就避免了巨大的磁盘IO。

MySQL本身有一个UUID函数,例子如下:

mysql> SELECT UUID();

603fd892-adec-11df-b4c2-676ff78bcf6c
61d8f29b-adec-11df-b4c2-676ff78bcf6c

多执行几次会发现MySQL UUID函数本身有一定的顺序性,但这种顺序性有限,重启服务之类的操作还会影响它。

网上到处搜索了一下,最后才发现MySQL下似乎现在还没有众所周知的GUID(UUID)COMB方案。

http://hi.baidu.com/thinkinginlamp/item/b20a4fddf70b40e955347f11