select语句where的作用 (MySQL学习)
发布于 2007-09-14 20:52 阅读:41194 评论:7 标签: mysql select where

      where,是个好东西!

      但你面对千万级的数据,如何更快的所用遍历数据,并根据自己的需要处理数据?where会起到多大的作用?

      当然,前提是数据中的某数据有它的规律。

      假如,有一表有一个字段tableid为int,唯一且索引。在这个时候我们可以使用where字句让遍历加速。

      比较以下两个语句:

以下是代码片段:

select * from `tablename` order by `tableid` limit $numStart, 10000;

select * from `tablename` where `tableid`>'$tableidStart' order by `tableid` limit 10000;

      上面的例子是想根据tableid的顺序来遍历整个表,所以有个排序的字句。显然,对于千万级别的库或表来说排序这个费时间的事情,但是没关系,前面已经假设它有索引了,所以时间相对还是可以承受的。

      索引有这么大的作用么?不信可以看看mysql数据存储目录下的.MYI文件的大小,再看看.MYD文件的大小,一目了然!常言道,不能占着茅坑不拉屎,mysql很好的避免了这一点!

      相信你可以注意到limit子句中,偶限制的条件是“10000”。在损耗内存和操作数据库的权衡中,我还是比较倾向损耗内存。

      言归正传,说一下where子句。如果没有where,只有“$numStart, 10000”,那么这个查询会如何进行呢?mysql会根据“order by `tableid`”以后,再找到前$numStart条数据,然后从第$numStart+1条数据开始返回1000条数据。请注意这个“再找到前$numStart条数据”的时间,它是随着$numStart的增加而增加的!

      时间的损耗,正在于此。没有时间的教训是不会注意到这个的。我曾犯过这个错误,然后认识到了这一点。但是,时间一长......又忘记啦!

      如果在这个时候,我们加上一个“where `tableid`>'$tableidStart'”,时间的损耗立马减少了!这个字段是有索引的,找到一个特定的值的时间几乎可以忽略!在这个时候,对这个有索引的字段排序再找前10000条(“limit 10000”),简直易如反掌!

      在我的测试中,假设没有where子句的语句要跑5个小时,那么加上这个where子句,只需40分钟!这个时间是怎么节省出来的?主要是在“再找到前$numStart条数据”的时间,前面提到这个几乎是个等差数列的方式的增长。而加上where子句,这个时间差几乎为0!

      特以此文,警示自己不再忘记!

      两条语句中使用两个变量,变量怎么来的,大家根据情况而定了。

展开全文  
收起全文  
Lost connection to MySQL server during query (MySQL学习)
发布于 2007-09-13 11:24 阅读:36705 评论:0 标签: mysql

  今天发现一个Mysql的远程连接出现"Lost connection to MySQL server during query"。而且定义的中间变量出现异常变化

  我们在遇到问题的时候,最郁闷的不是找不到解决方法,而是不知道引发错误的原因有很多种。上网查看的资料,你看了半天会很纳闷:这是哪门子的事呢?情况怎么和我的一点也没相似之处呢?

  很郁闷,今天偶又遇见这种事了!

  查询资料http://www.linuxaid.com.cn/tips/4/3/432627797.shtml,里面提到:

以下是引用片段:

  这个问题是由于glibc的一个bug造成的。
  在glibc某些版本中,gethostbyaddr函数(确切地说是_nss_dns_gethostbyaddr_r)存在缓冲区溢出问题,在处理大数据时会造成SEGMENT FAULT。
  在处理远程连接时,mysqld会调用ip_to_hostname()函数,再由这个函数调用gethostbyaddr函数,最后系统在执行nss_dns_gethostbyaddr_r函数处崩溃。因此,会出现上述情况。
  解决问题的办法是升级glibc。

  但实际上,在偶这的情况却不是这样的。

  在执行“php a.php”后,再次执行“php a.php”,便有可能出现“Lost connection to MySQL server during query”的错误。用“ps aux | grep php”,会显示一个“php a.php”的进程。之所以是一个,是因为在mysql出错后那个进程就自己断了。

  解决方案:找到进程号,直接kill!

  使用的连接是短连结(mysql_connect())。为什么会丢失连接?还未知。

展开全文  
收起全文  
php的异常处理基础学习 (PHP心得)
发布于 2007-09-09 18:33 阅读:10025 评论:2 标签: php 学习 异常

  一直以来对PHP5没怎么好好学习,属于那种用着的时候,查手册Google资料的那种人。前天看见同事的程序满眼的try,throw,catch,立马汗颜。不禁为自己在这方面的知识深深自责一下

  今天挤出点时间学习了这个东西。参考了一下文档:
  1:PHP 15:异常
  2:用实例分析PHP5异常处理,一看就懂
  3:PHP 5.0异常处理机制深度探索
  4:PHP5的异常处理机制

  PHP5内建的异常类需要有以下成员方法:

__construct() 构造函数,需要一个出错信息和一个可选的整型错误标记作参数
getMessage() 取得出错信息
getCode()
出错的代码
getFile() 异常发生的文件
getLine() 异常发生的行数
getTrace() 跟踪异常每一步传递的路线,存入数组,返回该数组
getTraceAsString()

和getTrace()功能一样,但可以将数组中的元素转成字符串并按一定格式输出

 __toString()  允许简单的显示Exception对象,并且给出所有以上方法给出的信息。

  Haohappy有几句话说的很好,PHP的异常机制可以满足我们如下的4点需求:

以下是引用片段:

1.允许一个方法给出一个出错标记给客户代码
2.提供程序错误的详细信息
3.让你同时判断多个出错条件,将你的错误报告和程序处理流程分开。
4.返回值必须是独立的类型,不会与正常返回的类型相混淆

  写了点程序练习一下:

以下是代码片段:

$a = 20;

// 使用常规catch的例子
try
{
  if($a == 1)
  {
    throw new Exception("I am 1", 1);
  }
  elseif ($a == 2)
  {
    throw new Exception("I am 2", 3);
  }
  elseif ($a == 3)
  {
    throw new Exception("I am 3", 3);
  }
  elseif ($a == 4)
  {
    throw new Exception("I am 4", 4);
  }
  else
  {
    throw new Exception("Who am I ?", 0);
  }
}
catch (Exception $e)
{
  if($e->getCode() == 1)
  {
    echo "1 : ".$e;
  }
  elseif ($e->getCode() == 2)
  {
    echo "2 : ".$e;
  }
  elseif ($e->getCode() == 3)
  {
    echo "3 : ".$e;
  }
  elseif ($e->getCode() == 4)
  {
    echo "4 : ".$e;
  }
  else
  {
    echo "0 : ".$e;
  }
}

echo "


";

// 使用不同的扩展异常类的例子
class A extends Exception{};
class B extends Exception{};

try
{
 if($a == 1)
  {
    throw new A("I am A", 1);
  }
  elseif ($a == 2)
  {
    throw new B("I am B", 2);
  }
  else
  {
    throw new Exception("Who am I ?", 0);
  }
}
catch (A $e)
{
  echo "1 : ".$e;
}
catch (B $e)
{
  echo "2 : ".$e;
}
catch (Exception $e)
{
  echo "0 : ".$e;
}

?>

  输出如下:

以下是引用片段:

0 : exception 'Exception' with message 'Who am I ?' in D:\WebPHP\WWW\new\test.php:24 Stack trace: #0 {main}


0 : exception 'Exception' with message 'Who am I ?' in D:\WebPHP\WWW\new\test.php:69 Stack trace: #0 {main}

展开全文  
收起全文  
写一下前段时间遇到的mysql问题 (MySQL学习)
发布于 2007-09-08 20:05 阅读:22819 评论:0 标签: mysql

      今天给网站换了一个编辑器,终于可以使用“引用”和“代码”两个模式了,以前用的编辑器一直没这个功能,甚至连个上传的都没有,现在终于都有了,只是编辑器的颜色很难看,很奇怪在偶自己本地的时候可以换一个好看的颜色,但到了这个空间。。。。。。世界就变了,要是换个颜色编辑器就不能用了,只好将就了,等有了时间再弄弄

    本来是想吧整个站点都改了以后再换编辑器,但是实在没时间做整站的改动,只好先把编辑器换了。哎,毕业了,空余时间也少了。

    不说废话,发点代码,玩玩新功能吧。

1:用命令把数据库导到文本中。

    资料来自:http://blog.csdn.net/sd_lichangyou/archive/2006/08/22/1106257.aspx

    命令是mysqldump例如我要将我的数据库myproject中的所有表导出来。步骤是

    第一:到mysql安装目录的bin下
    第二:

以下是代码片段:

     mysqldump -h localhost -u root -p myproject -r d:\myproject.sql


    第三:回车后提示输入密码,然后就OK了,保存在了d盘下

    注:这个命令偶没试过,汗~~~~

    记得用命令导数据表可以用:

以下是代码片段:

    select * from tablename into outfile "filename"

   不过在linux/unix下要记得对所在的目录授予写权限,如:

以下是代码片段:

    chmod 777 /home/mydir

2:远程连库时的IP限制问题

    从IP A上连接IP B上的mysql的时候提示:

以下是代码片段:

     Warning: mysql_pconnect(): Access denied for user: 'root@A (Using password: YES)
     in /usr/home/shengting/del_error.php on line 6


    发现A为vip(虚拟IP)

    解决方法,在没有mysql的mysql库中的user表里面添加Host字段值“A”

    上面所说的并不是只有vip才有这个限制,只是偶遇见的是vip而已。

3:$arr["count(`id`)"] 错写成 $arr[count(`id`)]

4:更改表名更改表名:

    命令:rename table 原表名 to 新表名;
    例如:在表MyClass名字更改为YouClass

以下是代码片段:

    mysql> rename table MyClass to YouClass;

5:清空数据表

以下是代码片段:

    truncate table tablename;

6:如何把操作mysql损失降到最低

    应该在启动mysql时加上参数"--i-am-a-dummy"。(我是个新手)
    此时mysql将拒绝执行不带where的update和delete命令

7:mysql文件的认识

以下是引用片段:

.frm 是描述表结构的文件
.MYD 是表的数据文件
.MYI 是表数据文件中任何索引的数据树。

8:char 或 varchar的区别

以下是引用片段:

    如果使用 char 或 varchar,建议执行以下操作:
    如果列数据项的大小一致,则使用 char。
    如果列数据项的大小差异相当大,则使用 varchar。
    如果列数据项大小相差很大,而且大小可能超过 8,000 字节,请使用 varchar(max)。

展开全文  
收起全文  
导库时发现了两个mysql问题 (MySQL学习)
发布于 2007-08-29 21:22 阅读:46019 评论:1 标签: mysql

由于准备重新架构网站,涉及到数据备份问题,问题由此引发。

第一个:

由wyaj的phpmyadmin导出的数据在偶机子上导入时老是提示有臭虫,大意是什么二进制、引号之类的问题。还以为是数据存在大量单双引号出现的问题,于是便写程序自己把数据导出来再导进去。提示依旧。

突然感觉这个问题以前也似乎出现过。于是"set names gb2312"、"set names gbk"、"set names utf8"之类的命令一个一个的试。结果还是很无语。

也不知道是使用什么方法处理了一下,发现终于出了一个又很熟悉的错误:"ERROR 1406 : Data too long for column xxx"。顿时觉悟了。

当初抱着严格要求自己写sql语句的目的,把mysql设置为"STRICT_TRANS_TABLES"。于是便引发了这个问题,还害得偶自己写程序去导数据。

解决方法:

sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"把其中的"STRICT_TRANS_TABLES,"去掉,然后重启mysql就ok了。

第二个:

自己写了一个mysql操作类,里面对操作的错误做了报警。其中里面有:
$this->affectNum = mysql_num_rows($this->queryId) or .......;
$this->affectNum = mysql_affected_rows($this->queryId) or .......;

问题又出来了,当返回的值是0的时候,也会执行"or"后面的语句。当时百思不得其解,幸好有里面的纯属误会指点,叫偶查手册才明白,上面两个函数的返回值是int。顺便指出偶程序中的bug:为了防止未知的意外情况,在使用foreach之前,一定要 is_array()!

哎,这都是很基础的问题。

展开全文  
收起全文  
世界上最痛苦的事 (随便说说)
发布于 2007-08-22 16:24 阅读:80989 评论:3 标签: C C++ 工作 痛苦

世界上最痛苦的事,是修改程序。

比修改程序更痛苦的事,是修改别人的程序。

比修改别人程序更痛苦的事,是修改一大批别人的程序。

比修改一大批别人的程序更痛苦的事,是修改的这个程序的语种是自己不熟悉的。。。。。

不过还好,学习么!

展开全文  
收起全文  
准备挤点时间改版一下 (本站点滴)
发布于 2007-08-06 20:04 阅读:8100 评论:4 标签: 改版

很久没修改过网站了,感觉很多东西都没有。太懒啦。

这几天想了想,准备加上下面的东西,花点时间来做做,有兴趣的也帮偶想想哈。时间短则一个月,长则一年。没办法,有电脑的空余时间太少了。

1:保留现有的数据
2:email订阅和取消blog和原来如此的文章
3:隐藏文章,只供特定权限的人看
4:加强留言本的安全:过滤,数据来源等
5:留言通知管理员:email和后台message通知
6:所有留言都记录IP
7:全站识别会员
8:栏目为二级栏目
9:title之类的全局变量
10:宽像素拟为1000
11:数据表要考虑移植,如加变量前缀
12:后台编辑器要换
13:待续。。。。。。

 

展开全文  
收起全文  
第三次搬家 (随便说说)
发布于 2007-07-30 08:53 阅读:48123 评论:1 标签: 搬家 北京 生活

第三次搬家了。

本来上个星期已经决定不搬的,结果周六楼管突然通知,如果不住半年就不让下个月继续住了。

立马周六找房,周日搬家,效率极高,累死

当时的想法是:谁给偶房子住偶跳槽去他那

展开全文  
收起全文  
我还活着 (随便说说)
发布于 2007-07-26 19:52 阅读:5578 评论:1 标签: 活着

很久没更新,但偶还活着。

学会每天写工作/生活日志/记,到老了再回顾一下。

又一个校友来面试,希望有个很好的结果。

最近似乎进步不大,啊。。。。。。。。。

展开全文  
收起全文  
毕业后上班流水帐 (随便说说)
发布于 2007-07-12 09:00 阅读:40712 评论:8 标签: 毕业 工作 生活

2007-07-09

毕业后第一天上班

接到不爽的消息,整组要调到另一个部门,为避免手续的麻烦,所以等组里的调离手续办好后,再办理转正。晕死!

也许是一个月后的第一天上班,主管说偶今天还没进入状态。。。。

2007-07-10

做好目前可控的事情,不可控的事情会越来越少

努力做好现在的工作,对未来报着平和和激昂的心态,绝不急躁

中午见到以前的主管,鼓励偶在公司的平台下好好做下去,会很有前途滴。。。。。。。

2007-07-11

全组调整座位,搬到另外一层。电梯遇见某部门漂亮的助理MM,没认出来,然后被其鄙视。。。。

体会到什么叫海量的数据。。。

 

展开全文  
收起全文