mysql读取时常犯的小错误

一、不要在循环中执行mysql。

我想很多童鞋都用过这样的方法获取二级分类。一次刷新中,尽量用最少的sql。

select * from category where fid = 0;

先获取父级分类。

再用

foreach($data as $v){
$db->query("select * from category where fid = {$v.id} ");//获取子分类。
}

这方法很不好,如果你获取的数据不止十来条,而且访问量不止百来个,那你的网站还能撑得住吗?
解决办法就是用select * from category,获取你要的所有数据,在用php的方法对这数组进行处理。

方法网上很多,如果固定多少级别分类,普通的foreach就做到,但是要做到无限极分类,那么就用递归吧。

二,宁愿用select 所有字段名称,也别用select *

这样可以让你养成习惯,毕竟面对几百万数据的时候,你用select 需要的字段,和select *比,快很多,后者把所有数据都取出来了。前者只是取你需要的数据。

三,和第一相反,有时候为了效率,尽量在一个刷新里执行最少的sql,尽量把一些数据用一句sql读出来,但是现在说的是,不要盲目的用一句sql。

比如,

select a.id,a.name,...,b.bid,b.bname,....,c.cid,c.cname,...
from table1 a
left join table2 b
on a.id = b.bid
left join table3 c
……
where
...

少用left join联动,如果你连的是索引,那倒没多大影响,如果你数据库里数据不多访问量不大也不大影响。
问题是如果数据多,你多连一个表,查询次数就要多乘以那个表的全表查找数量。

可以使用explain查看每个表的查询次数,最后相乘就是总查询次数。

假设table1表1000条数据。table2 2000,table3 500

那么,mysql 为了查询你这条sql结果,一共查询了,1000*2000*500 次,速度很慢(当然这里是假设三个表都没有用到索引)。

 

本博客所有文章如无说明,则均为作者黄丁丁原创
转载请注明出处:http://www.cnblogs.com/huangdingding

本文地址:http://www.cnblogs.com/huangdingding/archive/2012/10/20/2732677.html

转载于:https://www.cnblogs.com/huangdingding/archive/2012/10/20/2732677.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值