关于程序算法及思想.
多列索引与多个索引的对比
| November 19, 2008 18:53 | root | Via 本站原创
原文是Multiple column index vs multiple indexes
对于要经常查询的含量大量数据的数据库,建立索引是非常重要的,建立索引一般都是在where语句用得较多的列上。现在有个问题,如果一个表有多个列需要建立索引,是把所有列建成一个索引,还是对每一个列建一个索引,上篇文章做了一个介绍,这是作者得出的结论,Conclusion: For benchmarked queries we can see Multiple Column index beats Index Merge in all cases when such index can be used. It is also worth to watchout a MySQL may decide not to do Index merge (either intersection or union) but instead do full table scan or access table picking only one index on the pair.意思应该是说对多个列建索引比对每个列分别建索引更有优势,而且要知道索引建立得越多就越占磁盘空间,在更新数据的时候速度会更慢。
这是一个多列索引的问题,这个问题是如何安排列的顺序是至关重要的,比如需要对一个表里面的两个字段uid, rstatus建一个索引,那么索引的顺序是(uid, rstatus)还是(rstatus, uid)呢。在搞清楚如何安排顺序之前先了解一个概念,cardinality:金山的翻译是"集的势",比如,Mytest表有1700条记录,rstatus字段有750个不同的记录,那么就可以说We have a cardinality of 750 for rstatus。总的规则可以说是cardinality越大的字段应该排在索引的第一位就是说索引的位置是(rstatus, uid),因为cardinality越大那么第一次取出来的记录集就越小,再进行第二次查询的次数就越少了。不过这只是对于建两个索引的规则,如果是三个以上就没有那么简单了,具体地看原文,有比较详细的例子。还需要提出的是即使我们建了一个很有效的索引,但是查询优化器也许会选择不用它,如果它会考虑更多因素以决定这个索引是否有足够的效率。
It was also pointed out to me, that even if an efficient multi-column index is created, the query optimizer may choose to never use it. This is
because the optimizer looks at further statistics to determine if the index would be efficient enough or not.
官方文档:http://dev.mysql.com/doc/r...
老外的博客:
http://blog.decaresystems.... 也有比较详细的介绍mysql如何使用联合索引的!
我试了一下将建立联合索引的顺序变化为KEY `u_r` (rstatus,`uid`) 出现:ref key_len 都有变化,如下:
mysql> explain select * from mytest where uid in (1,2) and rstatus = 1;
+----+-------------+--------+-------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+-------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | mytest | range | u_r | u_r | 8 | NULL | 2 | Using where |
+----+-------------+--------+-------+---------------+------+---------+------+------+-------------+
1 row in set (0.03 sec)
mysql> INSERT INTO `mytest` (`id`, `uid`, `rstatus`) VALUES(null, 3, 1);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO `mytest` (`id`, `uid`, `rstatus`) VALUES(null, 4, 1);
Query OK, 1 row affected (0.00 sec)
mysql> explain select * from mytest where uid in (1,2) and rstatus = 1;
+----+-------------+--------+-------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+-------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | mytest | range | u_r | u_r | 8 | NULL | 2 | Using where |
+----+-------------+--------+-------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)
mysql> explain select * from mytest where uid in (3,4) and rstatus = 1;
+----+-------------+--------+------+---------------+------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+------+---------------+------+---------+-------+------+-------------+
| 1 | SIMPLE | mytest | ref | u_r | u_r | 4 | const | 1 | Using where |
+----+-------------+--------+------+---------------+------+---------+-------+------+-------------+
1 row in set (0.00 sec)
老外原文:
Conclusion: For benchmarked queries we can see Multiple Column index beats Index Merge in all cases when such index can be used. It is also worth to watchout a MySQL may decide not to do Index merge (either intersection or union) but instead do full table scan or access table picking only one index on the pair.
我估计是对多个列建索引比对每个列分别建索引更有优势,mysql会根据最好的平均效率选取需不需要索引,如Mysql分析发现不用索引更快那就不必用到索引了!
in适用于外表大内表小的情况!与数据的多少也很有关系的!
对于要经常查询的含量大量数据的数据库,建立索引是非常重要的,建立索引一般都是在where语句用得较多的列上。现在有个问题,如果一个表有多个列需要建立索引,是把所有列建成一个索引,还是对每一个列建一个索引,上篇文章做了一个介绍,这是作者得出的结论,Conclusion: For benchmarked queries we can see Multiple Column index beats Index Merge in all cases when such index can be used. It is also worth to watchout a MySQL may decide not to do Index merge (either intersection or union) but instead do full table scan or access table picking only one index on the pair.意思应该是说对多个列建索引比对每个列分别建索引更有优势,而且要知道索引建立得越多就越占磁盘空间,在更新数据的时候速度会更慢。
这是一个多列索引的问题,这个问题是如何安排列的顺序是至关重要的,比如需要对一个表里面的两个字段uid, rstatus建一个索引,那么索引的顺序是(uid, rstatus)还是(rstatus, uid)呢。在搞清楚如何安排顺序之前先了解一个概念,cardinality:金山的翻译是"集的势",比如,Mytest表有1700条记录,rstatus字段有750个不同的记录,那么就可以说We have a cardinality of 750 for rstatus。总的规则可以说是cardinality越大的字段应该排在索引的第一位就是说索引的位置是(rstatus, uid),因为cardinality越大那么第一次取出来的记录集就越小,再进行第二次查询的次数就越少了。不过这只是对于建两个索引的规则,如果是三个以上就没有那么简单了,具体地看原文,有比较详细的例子。还需要提出的是即使我们建了一个很有效的索引,但是查询优化器也许会选择不用它,如果它会考虑更多因素以决定这个索引是否有足够的效率。
It was also pointed out to me, that even if an efficient multi-column index is created, the query optimizer may choose to never use it. This is
because the optimizer looks at further statistics to determine if the index would be efficient enough or not.
官方文档:http://dev.mysql.com/doc/r...
老外的博客:
http://blog.decaresystems.... 也有比较详细的介绍mysql如何使用联合索引的!
我试了一下将建立联合索引的顺序变化为KEY `u_r` (rstatus,`uid`) 出现:ref key_len 都有变化,如下:
mysql> explain select * from mytest where uid in (1,2) and rstatus = 1;
+----+-------------+--------+-------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+-------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | mytest | range | u_r | u_r | 8 | NULL | 2 | Using where |
+----+-------------+--------+-------+---------------+------+---------+------+------+-------------+
1 row in set (0.03 sec)
mysql> INSERT INTO `mytest` (`id`, `uid`, `rstatus`) VALUES(null, 3, 1);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO `mytest` (`id`, `uid`, `rstatus`) VALUES(null, 4, 1);
Query OK, 1 row affected (0.00 sec)
mysql> explain select * from mytest where uid in (1,2) and rstatus = 1;
+----+-------------+--------+-------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+-------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | mytest | range | u_r | u_r | 8 | NULL | 2 | Using where |
+----+-------------+--------+-------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)
mysql> explain select * from mytest where uid in (3,4) and rstatus = 1;
+----+-------------+--------+------+---------------+------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+------+---------------+------+---------+-------+------+-------------+
| 1 | SIMPLE | mytest | ref | u_r | u_r | 4 | const | 1 | Using where |
+----+-------------+--------+------+---------------+------+---------+-------+------+-------------+
1 row in set (0.00 sec)
老外原文:
Conclusion: For benchmarked queries we can see Multiple Column index beats Index Merge in all cases when such index can be used. It is also worth to watchout a MySQL may decide not to do Index merge (either intersection or union) but instead do full table scan or access table picking only one index on the pair.
我估计是对多个列建索引比对每个列分别建索引更有优势,mysql会根据最好的平均效率选取需不需要索引,如Mysql分析发现不用索引更快那就不必用到索引了!
in适用于外表大内表小的情况!与数据的多少也很有关系的!
FreeBSD与Linux再比较
| November 19, 2008 15:12 | root | Via 本站原创
传说中FreeBSD比linux稳定,大型网站几乎都建立在FreeBSD系统上,我一直疑惑难道linux是否真的不能做大型网站。于是用netcraft网站做了个测试:
但163/126就全部用上了linux,令人费解。
看来用linux做大站的也不少啊!!!谁说linux不能做大站呢?
另外又发现两个奇怪的东东:
www.ebay.com 居然清一色的win2000!!!
http://www.myspace.com 全美访问量第一,居然也清一色的win2003;
在我印象中,大型网站是压根不能用windos系统的。但这两个案例给我的理论一个有力的回击:系统稳定与否,关键还是在人!
无论是Windows还是FreeBSD还是Linux都可以做大型网站,只要人足够牛X就行。这里不谈windows了,还是从大家口水仗打得最厉害的linux和freebsd分析分析吧。
首先说明一点:为什么不拿linux和windows比较,而只是和freebsd比较呢?答案在于linux或是freebsd都感觉到了对方带来的压力,都认定对方是自己的竞争对手。既然称得上是对手,自然是各有所长,难分轩轾,谁也不能把谁压倒罢了。
论坛里争论FreeBSD和linux谁谁更好,其实是从一个静态的角度来看的,在某个特定时间里,FreeBSD或许比linux更稳定,linux或许比FreeBSD更快捷,但两家都在动态发展,没有谁永远领先,没有谁永远落后,FreeBSD稳定的特性,Linux2.6可以超越它;而linux 快捷的优势,FreeBSD也会迅速居上。我就不信,linus和他的黑客团队在技术上会输给学院派的FreeBSD团队?或者FreeBSD的高手们比不上一群黑客,?他们谁都可以暂时领先,谁都可以暂时落后,但谁都不是吃干饭的!
目前流行这么一种传说:linux和freebsd内核性能上相比:linux2.2比freebsd要差,linux2.4和freebsd难分伯仲,而linux2.6比freebsd好得多。这里freebsd被静态化了,以一个动态发展的linux去比较某个固定版本的freebsd,显然是有失公平的。有道是:士别三日,即更刮目相看,更何况是技术日新月异的IT行业!
又有这么一种说法:LINUX被黑的多而FreeBSD被黑的少,盖出于安全性较逊?这也是无稽之谈,用liunx的人基数比freebsd大,菜鸟自然也就更多了。系统安不安全关键在人,如果你不信,可以尝试去黑一下www.ebay.com或www.myspace.com,他们的服务器可都是windows哟。
其实两家最根本的差别不在技术,而在于设计理念:linux不求最稳,但求最新;FreeBSD不求最新,只求最稳——这样说也许不对,但也能反映一些问题。
我对FreeBSD与Linux比较的最终结论是:谁好谁稳定都只是暂时的,两家的存在状态,是一个“既生瑜何生亮”的问题,在长久的发展过程中,技术上的常胜将军并不存在,双方只有此消彼长,各领风骚。至于大家为什么非要证明FreeBSD比Linux好或Linux比FreeBSD好,我想程序员普遍都喜欢追求完美,非要用最好最完美的系统才甘心吧!
FreeBSD和Linux我都用过,不在超大型应用中,很难感受两者的差别。个人选择的linux,考虑到使用linux的人比较多,商机自然也就更多吧,钱在哪眼光就看哪,至少linux的就业机会比FreeBSD多。当然,这是非技术因素的考虑了。
------------------------------------------------------------------------------------------------------
http://toolbar.netcraft.com/site_report?url=www.phpchina.com
按照上面的链接你就可以查询任何一个网站的服务器架构,当然,可信度和准确度我不能保证。下面是我测试的案例:www.phpchina.com清一色linux;
www.tencent.com清一色linux;
www.qq.com清一色linux;
www.taobao.com linux;
www.ebay.com.cn 查询显示OS清一色linux,WebServer清一色IIS,令人费解;
www.alibaba.com 清一色linux;
www.bokee.com清一色的linux;
www.google.com清一色linux;
www.pconline.com.cn linux;
www.yninfo.com清一色的linux;
www.tom.com 清一色Debian;
www.cctv.com linux+sun的服务器;
www.126.com 清一色linux
www.163.com清一色linux,大家或许都认为网易是使用FreeBSD的,
www.tencent.com清一色linux;
www.qq.com清一色linux;
www.taobao.com linux;
www.ebay.com.cn 查询显示OS清一色linux,WebServer清一色IIS,令人费解;
www.alibaba.com 清一色linux;
www.bokee.com清一色的linux;
www.google.com清一色linux;
www.pconline.com.cn linux;
www.yninfo.com清一色的linux;
www.tom.com 清一色Debian;
www.cctv.com linux+sun的服务器;
www.126.com 清一色linux
www.163.com清一色linux,大家或许都认为网易是使用FreeBSD的,
但163/126就全部用上了linux,令人费解。
看来用linux做大站的也不少啊!!!谁说linux不能做大站呢?
另外又发现两个奇怪的东东:
www.ebay.com 居然清一色的win2000!!!
http://www.myspace.com 全美访问量第一,居然也清一色的win2003;
在我印象中,大型网站是压根不能用windos系统的。但这两个案例给我的理论一个有力的回击:系统稳定与否,关键还是在人!
无论是Windows还是FreeBSD还是Linux都可以做大型网站,只要人足够牛X就行。这里不谈windows了,还是从大家口水仗打得最厉害的linux和freebsd分析分析吧。
首先说明一点:为什么不拿linux和windows比较,而只是和freebsd比较呢?答案在于linux或是freebsd都感觉到了对方带来的压力,都认定对方是自己的竞争对手。既然称得上是对手,自然是各有所长,难分轩轾,谁也不能把谁压倒罢了。
论坛里争论FreeBSD和linux谁谁更好,其实是从一个静态的角度来看的,在某个特定时间里,FreeBSD或许比linux更稳定,linux或许比FreeBSD更快捷,但两家都在动态发展,没有谁永远领先,没有谁永远落后,FreeBSD稳定的特性,Linux2.6可以超越它;而linux 快捷的优势,FreeBSD也会迅速居上。我就不信,linus和他的黑客团队在技术上会输给学院派的FreeBSD团队?或者FreeBSD的高手们比不上一群黑客,?他们谁都可以暂时领先,谁都可以暂时落后,但谁都不是吃干饭的!
目前流行这么一种传说:linux和freebsd内核性能上相比:linux2.2比freebsd要差,linux2.4和freebsd难分伯仲,而linux2.6比freebsd好得多。这里freebsd被静态化了,以一个动态发展的linux去比较某个固定版本的freebsd,显然是有失公平的。有道是:士别三日,即更刮目相看,更何况是技术日新月异的IT行业!
又有这么一种说法:LINUX被黑的多而FreeBSD被黑的少,盖出于安全性较逊?这也是无稽之谈,用liunx的人基数比freebsd大,菜鸟自然也就更多了。系统安不安全关键在人,如果你不信,可以尝试去黑一下www.ebay.com或www.myspace.com,他们的服务器可都是windows哟。
其实两家最根本的差别不在技术,而在于设计理念:linux不求最稳,但求最新;FreeBSD不求最新,只求最稳——这样说也许不对,但也能反映一些问题。
我对FreeBSD与Linux比较的最终结论是:谁好谁稳定都只是暂时的,两家的存在状态,是一个“既生瑜何生亮”的问题,在长久的发展过程中,技术上的常胜将军并不存在,双方只有此消彼长,各领风骚。至于大家为什么非要证明FreeBSD比Linux好或Linux比FreeBSD好,我想程序员普遍都喜欢追求完美,非要用最好最完美的系统才甘心吧!
FreeBSD和Linux我都用过,不在超大型应用中,很难感受两者的差别。个人选择的linux,考虑到使用linux的人比较多,商机自然也就更多吧,钱在哪眼光就看哪,至少linux的就业机会比FreeBSD多。当然,这是非技术因素的考虑了。
------------------------------------------------------------------------------------------------------
freebsd下安装gonme
| November 19, 2008 11:37 | root | Via 本站原创
GNOME 是一个用户界面友好的桌面环境,能够使用户很容易地使用和配置他们的计算机。 GNOME 包括一个面板(用来启动应用程序和显示状态),一个桌面(存放数据和应用程序的地方),一套标准的桌面工具和应用程序, 和一套与其他人相互协同工作的协议集。其他操作系统的用户在使用 GNOME提供的强大的图形驱动环境时会觉得很好。
安装 GNOME的最简单的方法是在FreeBSD安装过程中通过 “Desktop Configuration”菜单来进行。它们也可以很容易地从一个package或Ports Collection安装:要从网络安装GNOME,只要键入: # pkg_add -r gnome2 从源代码编译GNOME,可以使用 ports树: # cd /usr/ports/x11/gnome2 # make install clean 一旦GNOME被安装好, X Server必须被告知启动 GNOME以代替默认的窗口管理器。 如果在适当的位置已经定制好了文件.xinitrc, 简单地将启动当前窗口管理器的那行替换为 /usr/X11R6/bin/gnome-session。如果没有对配置文件做过什么特殊的改动, 只需简单地键入: % echo "/usr/X11R6/bin/gnome-session" > ~/.xinitrc 接着,键入startx, GNOME桌面环境就启动了。
Note: 如果已经使用了一个像 XDM这样的显示管理器,就不能这样做。而是,用同样的命令创建一个可执行文件.xsession。要这样做,需要先编辑文件,然后用 /usr/X11R6/bin/gnome-session替换已存在的窗口管理命令: % echo "#!/bin/sh" > ~/.xsession % echo "/usr/X11R6/bin/gnome-session" >> ~/.xsession % chmod +x ~/.xsession 另一个选项是在登陆时配置显示管理器允许您选择窗口管理器;有关 KDE 细节会解释如何使用kdm, KDE显示管理器来做。
X11 通过“RENDER”扩展来支持 anti-aliasing。 GTK+ 2.0 以及更高的版本(被 GNOME使用的工具包)可以使用这个功能。 所以,使用最近的软件, anti-aliasing 可以应用在 GNOME桌面环境中。只需要依次选择 应用程序->桌面首选项->字体,然后选上 最佳形状, 最佳对比度,或者像素圆滑(LCD)。对于 GTK+ 应用程序,它们不是 GNOME 桌面的一部分,在启动程序前需要设置 环境变量GDK_USE_XFT的值为1。
安装 GNOME的最简单的方法是在FreeBSD安装过程中通过 “Desktop Configuration”菜单来进行。它们也可以很容易地从一个package或Ports Collection安装:要从网络安装GNOME,只要键入: # pkg_add -r gnome2 从源代码编译GNOME,可以使用 ports树: # cd /usr/ports/x11/gnome2 # make install clean 一旦GNOME被安装好, X Server必须被告知启动 GNOME以代替默认的窗口管理器。 如果在适当的位置已经定制好了文件.xinitrc, 简单地将启动当前窗口管理器的那行替换为 /usr/X11R6/bin/gnome-session。如果没有对配置文件做过什么特殊的改动, 只需简单地键入: % echo "/usr/X11R6/bin/gnome-session" > ~/.xinitrc 接着,键入startx, GNOME桌面环境就启动了。
Note: 如果已经使用了一个像 XDM这样的显示管理器,就不能这样做。而是,用同样的命令创建一个可执行文件.xsession。要这样做,需要先编辑文件,然后用 /usr/X11R6/bin/gnome-session替换已存在的窗口管理命令: % echo "#!/bin/sh" > ~/.xsession % echo "/usr/X11R6/bin/gnome-session" >> ~/.xsession % chmod +x ~/.xsession 另一个选项是在登陆时配置显示管理器允许您选择窗口管理器;有关 KDE 细节会解释如何使用kdm, KDE显示管理器来做。
X11 通过“RENDER”扩展来支持 anti-aliasing。 GTK+ 2.0 以及更高的版本(被 GNOME使用的工具包)可以使用这个功能。 所以,使用最近的软件, anti-aliasing 可以应用在 GNOME桌面环境中。只需要依次选择 应用程序->桌面首选项->字体,然后选上 最佳形状, 最佳对比度,或者像素圆滑(LCD)。对于 GTK+ 应用程序,它们不是 GNOME 桌面的一部分,在启动程序前需要设置 环境变量GDK_USE_XFT的值为1。
FreeBSD升级版本
| November 19, 2008 11:35 | root | Via 本站原创
1.安装CVSUP:
最好在安装时装好cvsup;
2.升组源码:
freebsd# ee /usr/share/examples/cvsup/stable-supfile
把:
default host=CHANGE_THIS.FreeBSD.org
改为:
default host=cvsup.FreeBSDchina.org
3.重新编译源码和内核
4.重新登陆系统进入单用户模式
启动时boot -s
源码和内核升级完毕
最好在安装时装好cvsup;
freebsd# cd /usr/ports/net/cvsup-without-gui/
freebsd# make install clean
freebsd# make install clean
2.升组源码:
freebsd# ee /usr/share/examples/cvsup/stable-supfile
把:
default host=CHANGE_THIS.FreeBSD.org
改为:
default host=cvsup.FreeBSDchina.org
freebsd# cvsup -g -L 2 /usr/share/examples/cvsup/stable-supfile
freebsd# cd /usr/obj
freebsd# chflags -R noschg *
freebsd# rm -rf *
freebsd# cd /usr/obj
freebsd# chflags -R noschg *
freebsd# rm -rf *
3.重新编译源码和内核
freebsd# cd /usr/src
freebsd# make buildworld
freebsd# make buildkernel KERNCONF=freebsd
freebsd# make installkernel KERNCONF=freebsd
reboot
freebsd# make buildworld
freebsd# make buildkernel KERNCONF=freebsd
freebsd# make installkernel KERNCONF=freebsd
reboot
4.重新登陆系统进入单用户模式
启动时boot -s
# adjkerntz -i //调整内核时区
# fsck -p //整理文件系统,自动修正所有可以安全地更正且不会导致数据丢失的问题
# mount -u / //装载根分区
# mount -a -t ufs //装载所有的ufs分区
# swapon -a //启动虚拟内存,打开交换空间
# mergemaster -p //选择YES
# cd /usr/src
# make installworld
# mergemaster //要安装的全选"i"
# reboot
# fsck -p //整理文件系统,自动修正所有可以安全地更正且不会导致数据丢失的问题
# mount -u / //装载根分区
# mount -a -t ufs //装载所有的ufs分区
# swapon -a //启动虚拟内存,打开交换空间
# mergemaster -p //选择YES
# cd /usr/src
# make installworld
# mergemaster //要安装的全选"i"
# reboot
源码和内核升级完毕




