问题 :You can't specify target table 'A' for update in FROM clause

今天在处理一个表的数据时,想直接把某个人对应的数据,对应到另一个人上去,思想很简单,就是把第一个人的对应的ID查出来,然后再用更新语句将所有ID在这里边的做一个更新操作,思路很清晰,操作很简单。好的,代码写好了直接操作数据库,

1
UPDATE house h SET h.Fuser_id = 79063 WHERE h.Fid IN (SELECT Fid from house WHERE Fuser_id = 79056 AND Fdistrict1 = '' AND Fis_process = 0);

但是在具体操作的过程中,问题出现了,问题是You can’t specify target table ‘A’ for update in FROM clause,问题出在哪了,一查资料原因是在更新这个表和数据时又查询了它,而查询的数据又做了更新的条件。
解决方案呢就是先将查出的表作为一个第三方表,然后查询第三方表实现隔离操作。

1
UPDATE house h SET h.Fuser_id = 79063 WHERE h.Fid IN (SELECT temp.Fid FROM (SELECT Fid from house WHERE Fuser_id = 79056 AND Fdistrict1 = '' AND Fis_process = 0) temp );

当然这种做法是最佳的选择,还有一个笨方法就是建立一个temp临时表,插入临时表,然后查询临时表,当然该方法的优点是在遇到数据量大的情况下,可以避免数据库内存不够用而导致的宕机。

浅谈PHP大数据处理

新换的公司,一个表中的数据竟然有29G之大,我顿时就懵了,更让我惊讶的是,还与另一个1G多的表做关联查询,真是让我摸不着头脑,尤其这是mysql数据库,也是惊出了我一身冷汗,好在还有优化的解决方案,下面简单谈一下我的解决方案。

  1. 尽量不要用inner join,内连接查询速度慢,建议为left jion。
  2. 建立索引,两个表中关联的字段都要加上key,可以为主键索引,唯一索引,普通索引等。
  3. limit 分段处理,每次取2000条,处理完之后再取数据处理。
  4. mysql数据库优化,将InnoDB的类型改为MyISAM,MyISAM数据引擎更适合大数据的搜索查询。
  5. 优化数据库,使用存储过程式查询,存储过程优势是查询一次后再次查询会很快。
  6. 利用Explain获取的信息来实现mysql优化,参考地址:http://www.cnblogs.com/promise-7/archive/2012/05/25/2517356.html

其实归根结底是数据库方面的优化,当然数据量很大的情况下,要提前预知好,更换数据库是避免查询宕机的关键,如果提前预知用oracle数据库的话,就不会出现现在的情况,现在改数据库,花费的代价很大。

浅谈Redis与Memcache的异同点

前段时间参加PHP的面试,几乎每个公司都会涉及到Nosql的问题,当前Nosql以高效存储,高效查询等优势迅速成为数据库的辅助工具,最为应用广泛的是Redis,Memcache,Mongodb等,其中Redis与Memcache是key-value型的数据存储,MongoDB是json格式的存储,以下浅谈以下redis与memcache的异同点。
1、 Redis和Memcache都是将数据存放在内存中,都是内存数据库。不过memcache还可用于缓存其他东西,例如图片、视频等等。
2、 数据类型–Memcache在添加数据时就要指定数据的字节长度,例如:

1
2
3
set key3 0 0 8
lxsymcto
STORED

而redis不需要,如:

1
2
3
4
redis 127.0.0.1:6379>set key2 "lxsymblog"
OK
redis 127.0.0.1:6379>get key2
"lxsymblog"

3、虚拟内存–Redis当物理内存用完时,可以将一些很久没用到的value 交换到磁盘,而memcache不会。
4、过期策略–memcache在set时就指定,例如set key1 0 0 8,即永不过期。
Redis可以通过例如expire 设定,例如expire name 10
5、分布式–设定memcache集群,利用magent做一主多从;redis可以做一主多从。都可以一主一从。
6、存储数据安全–memcache挂掉后,数据没了;redis可以定期保存到磁盘(持久化)。
7、灾难恢复–memcache挂掉后,数据不可恢复; redis数据丢失后可以通过aof恢复。

以上是对该两种数据库的分析,但是不论怎样都有优缺点,根据项目需求具体确定用哪种类型数据库才是最关键的。

2014 该有个总结

在写这个文章时,我特意看了一下文章《2013 ,该有个总结》,自己认真地读完了,内心莫名的一颤,不知为何,就是突如其来的伤感涌上心头,是感叹时间过的飞快,还是叹息这一年自己的所作所为呢,不得而知。当时给自己定下的目标实现了吗?一年前的青春奋斗激情是否还在内心澎湃?让自己真正走出阴影中,不在强颜欢笑?2014已然过去,来简单总结一下这个不平凡的2014。

阅读全文

解决PHP上传文件大小限制

一般情况下,php的上传文件大小都是在php.ini中配置好的,但是有时我们要上传比较大的文件,默认是不可以的,不能达到我们的需求,故修改配置文件如下:

配置php.ini文件 (以上传500M以下大小的文件为例)
查找以下选项并修改:

  1. file_uploads = On ;打开文件上传选项。

  2. upload_max_filesize = 500M ;上传文件上限。
    如果要上传比较大的文件,仅仅以上两条还不够,必须把服务器缓存上限调大,把脚本最大执行时间变长

  3. post_max_size = 500M ;post上限

  4. max_execution_time = 1800 ; 脚本最大执行时间

  5. max_input_time = 1800 ; 输入最大执行时间

  6. memory_limit = 128M ; 内存上限

记得配置完了后要重启apache等服务器服务,即可成功!