之前用PHPCMS进行二次开发的时候遇到过一个这样的问题,这个项目是我们文汇软件给客户做的一个客户考核系统,主表(表A)查询时需要关联其他表(表B)的查询结果作为查询条件,而(表B)中含有几千条的数据,当时就造成了sql执行很慢引起了程序超出最大执行时间,起初,检查sql语句时并没有发现什么错误,采用的就是基本的SQL查询,最终实现的效果如下。
“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来进行控制了。
上一篇: 中小企业如何选择建站公司?
关键词: