网站地图    收藏   

主页 > 后端 > php资料库 >

mysql数据库 select语句where的作用_自学php网

来源:自学PHP网    时间:2014-12-04 22:12 作者: 阅读:

[导读] where,是个好东西! 但你面对千万级的数据,如何更快的所用遍历数据,并根据自己的需要处理数据?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!

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

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

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论