咨询电话:
15628812133
03
2017/01

SQL语句主外键查询时,附表数据过多如何处理?

发布时间:2017-01-03 09:05:37
发布者:xiangpeiyu
浏览量:
0

之前用PHPCMS进行二次开发的时候遇到过一个这样的问题,这个项目是我们文汇软件给客户做的一个客户考核系统,主表(表A)查询时需要关联其他表(表B)的查询结果作为查询条件,而(表B)中含有几千条的数据,当时就造成了sql执行很慢引起了程序超出最大执行时间,起初,检查sql语句时并没有发现什么错误,采用的就是基本的SQL查询,最终实现的效果如下。

QQ图片20170103095912.png

“select  *  from  表A  where  id  in (select  id  from  表B  where 条件)”,如果表B只是几十条或者几百条时运行还是蛮快的,如果表B含有几千条(当时表中含有五千多条数据),运行的速度就很慢了,而且表A中也含有几百条数据,造成了php运行起来非常卡,查询结果完毕时耗时90多秒,所以在php中只能将这条sql语句分成两部分去分开执行,先将表B的数据查出来存放到数组中,再通过explode函数将数组按照“,”逗号作为连接符去拼接字符串,这样再从新组成sql语句,“select  *  from   表A  where  id  in (数组拼接的id字符串)”,这样查询速度耗时不到两秒,执行php脚步也分成流畅,至于为什么上面的那种sql语句在执行数据量很大时非常卡,这是因为sql的运行机制引起的,“select  *  from  表A  where  id  in (select  id  from  表B  where 条件)”先将表B中的几千条符合条件的数据查出依次和表A中每一条数据去做对比执行查询,而并不是说查询出表B然后直接和表A的条件去拼接执行,所以当sql无法优化的时候,只能通过php来进行控制了。

QQ图片20170103100435.png


关键词:
返回列表