为什么SELECT col1,col2,col3,col4 会比SELECT * 慢?

10月 7, 2007 on 1:31 pm | In 未分类 | 5 Comments

之前做过一个测试:
select id,title from ** 与select * from **的速度测试。
这是后续版.

  1. <?php
  2. define("TIMES",10000);
  3. $SQL1="SELECT * FROM stat_visits";
  4. $SQL2="SELECT v_id,v_url,v_site_id,v_screen_size,v_h,v_m,v_s,v_flash,v_director,
  5. v_quicktime,v_realplayer,v_pdf,v_windowsmedia,v_java,v_cookie,v_ref,v_remote_ip,
  6. v_timezone,v_color_depth,v_type,v_year,v_month,v_day,v_time FROM stat_visits";
  7. $conn=mysql_connect("localhost","root","");
  8. mysql_select_db("test");
  9. $time1=array_sum(explode(' ', microtime()));
  10. for($i=0;$i<times;$i++)
  11. </times;$i++)
  12.   mysql_query($SQL1);
  13. $time2=array_sum(explode(' ', microtime()));
  14. for($i=0;$i<times;$i++)
  15. </times;$i++)
  16.   mysql_query($SQL2);
  17. $time3=array_sum(explode(' ', microtime()));
  18.  
  19. $cost1=$time2-$time1;
  20. $cost2=$time3-$time2;
  21. print "cost1:$cost1\n";
  22. print "cost2:$cost2\n";
  23.  
  24. ?>

测试的结果是:

  1. [st@localhost test]$ php select.php
  2. cost1:2.1355810165405
  3. cost2:2.5820469856262
  4. [st@localhost test]$ php select.php
  5. cost1:1.9796178340912
  6. cost2:2.5190000534058
  7. [st@localhost test]$ php select.php
  8. cost1:1.9672379493713
  9. cost2:2.9030020236969
  10. [st@localhost test]$ php select.php
  11. cost1:1.9810240268707
  12. cost2:2.5505940914154

好了,现在将SQL1和SQL2次序交换:

  1. calhost test]$ php select.php
  2. cost1:2.5933158397675
  3. cost2:2.0362050533295
  4. [st@localhost test]$ php select.php
  5. cost1:2.6104090213776
  6. cost2:2.056037902832
  7. [st@localhost test]$ php select.php
  8. cost1:4.2802629470825
  9. cost2:3.3958988189697
  10. [st@localhost test]$ php select.php
  11. cost1:2.6283531188965
  12. cost2:2.0102050304413

大体上,SELECT COL1,COL2,COL3….. 与SELECT * 相比,两者花费的时间之比是4:5.不知道非空表的结果会不会是这样?

Mysql 随机读取记录的一种实现

10月 7, 2007 on 12:28 pm | In 未分类 | No Comments

这两天觉得自己的基本功不够扎实,于是躲在家里看PHP,mysql手册。
发现这个句子在大部分情况下能实现随机读取mysql记录:
表的结构如下:

  1. | id             | bigint(11) unsigned | NO   | PRI | NULL    | auto_increment |
  2. | tag            | varchar(32)         | NO   |     |         |                |
  3. | hash           | varchar(32)         | NO   |     |         |                |
  4. | created        | bigint(11)          | NO   |     |         |                |
  5. | article_id     | bigint(11)          | NO   |     |         |                |
  1. select * from tag order by RAND() desc limit 10\G

秘决在于:
1.Rand函数.
2.不仅用order by id可以依id排序,用order by 1也可以依id排序.因此用rand函数来生成order by 子句。

犯错误了,order by 1 确实可以生效,但是rand函数不能用在order by 子句中。 而且,当表中有column(1),column(2)…..共10列时,用order by 1,order by 2,….分别是按column(1),column(2)…排序的,但是我用order by 11时,就报错了。再用SELECT * FROM table order by RAND()*1000,却不报错。

看下面的例子:

  1. select *,(rand()*1000) as a from x_feeds order by a;

每次输出,都不同。
再稍变一次:

  1. mysql&gt;select *,(rand()*1000) as a from x_feeds order by 514;

每次都出错。
再变之:

  1. mysql&gt;select *,(rand()*1000) as a from x_feeds order by 514.37134

将order by 后跟上小数(学计算机的不能这么说啊),就能正常输出,但是是按表的原来顺序输出的,每次结果都一样。
暂时未找到真正原因,mysql文档中文版如此说:

你不能在一个ORDER BY子句用RAND()值使用列,因为ORDER BY将重复计算列多次。然而在MySQL3.23中,你可以做: SELECT * FROM table_name ORDER BY RAND(),这是有利于得到一个来自SELECT * FROM table1,table2 WHERE a=b AND c<d ORDER BY RAND() LIMIT 1000的集合的随机样本。注意在一个WHERE子句里的一个RAND()将在每次WHERE被执行时重新评估。

糟糕的ruby库

10月 6, 2007 on 5:16 pm | In Ruby, 未分类 | 1 Comment

题目其实错了。

ruby的确是个不错的语言,正如名字一般,像宝石一样。另一个语言也是,lua,名为月亮,也很棒。

但是我用ruby来构建一个微型的抓取/索引/检索系统,分词,存储,检索都没什么问题,但是在抓取HTML页面解析时出了问题:因为我用了一个库,这个库又依赖于另一个库…. 最后输出时输出一大篇大篇的出错信息,我只好加上ruby spider.rb 2> /dev/null 才能看到我自己的调试信息。 试了一下,原来用begin rescue end 语句不太好用,仍然无法阻止错误信息的输出。

刚刚又发现,用gem build rlucene.gemspec来打包时,又莫名奇妙地出错了.

郁闷。ruby库的可靠性真不怎么样。

去了趟动物园

10月 4, 2007 on 8:06 pm | In 杂谈 | No Comments

十一这几天一直没有陪老婆,所以今天特地带她去了趟动物园.
老虎

难得的是,听到了老虎的叫声.果然是王者.
狮子
狮子的眼睛在相片中居然像一颗灯一样.
熊猫
这只熊猫同学,您擦屁屁有10分钟了吧,现在终于擦完了?

腾讯QQ是用着不爽,但人没错

10月 3, 2007 on 11:23 pm | In 未分类 | No Comments

看到霍炬的这篇文章,确实,Tecent确实没错.
但是让人感到奇怪的是,居然有流言说,腾讯曾以“办公场所搬离深圳”为威胁,要求深圳市公安局到北京抓捕陈。看 到这我简直感到搞笑,说啥我也不信.一是如果腾讯确实如流言所说用不正当方式去”搞定”一个小小的大学教师,肯定有自己的公关啊啥渠道来运作,不会去威胁政府部门,何况威胁政府部门也不会用”办公场所搬离深圳”这样一个由头.深圳如此一个经济强市,巨头林立,跟传统行业的企业相比,tencent只是一个小毛孩,没有腾讯,深圳还是深圳,但是腾讯要搬离深圳,少不得大折腾一场,白折腾一场.

确实很多人讨厌腾讯,总是觉得人家这破软件不好,性能不好,乱七八糟的功能一大堆,不如木子版QQ,珊瑚版QQ好用,但是不好你可以不用啊.
腾讯的QQ软件不好用是一回事,改人家的东西侵犯版权是一回事.因为一个软件不好用就可以无视人家的版权,不是法律许可的.

联想到许多人不爽微软,总觉得用4块钱的Vista很爽,微软就应该提供4块钱的软件,最好还倒过来送钱给您.有人抱怨说,2000块钱一套啊,1000块钱一套啊,都太贵了.那您说说多贵合适啊?500一套?真要500让您掏 的时候,您还会说,贵了贵了.300?说说而已,真让您掏钱,您不一样说贵了么?杀毒软件二三百块钱一套,您负担得起吧?您都掏钱了吗?
是啊,一个这样的通讯软件,速度又快,最好只用1k的内存,又方便易用,不弹广告,增值业务您想要的就有(当然最好免费),不想要的就不装,最好腾读公司专门问过您老人家,然后照您的标准出.这样您满意了,是爽了,可是人腾讯吃什么啊?人腾讯出一个下载下来500M的客户端,运行起来CPU占一半,内存用500M内存的垃圾程序,那是人自己的事,都不犯法.

我支持的是,如果陈寿福在第一次判决后确实收手关闭珊瑚工作室网站的话,从道义支持一下陈寿福,但是陈寿福竟然置法院判决不顾,继续运营该网站并进行珊瑚QQ开发,这点确实过了,藐视法律,是该吃亏的.

« 上一页

Powered by WordPress with Pool theme design by Borja Fernandez.
Entries and comments feeds. Valid XHTML and CSS. ^Top^