Home >Backend Development >PHP Tutorial > 优化一句SQL语句!该怎么解决

优化一句SQL语句!该怎么解决

WBOY
WBOYOriginal
2016-06-13 13:43:441134browse

优化一句SQL语句!

SQL code
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->
select a.id,b.id as mycompid,b.typeid,b.co_end,a.pro_price,
a.pro_name as realproname,a.discount_rate,a.bigpic,a.temp_url,b.co_name,
c.pro_name,d.city_name,a.begindate,a.modifydate,a.pro_intro 
from product a 
left join company b on(a.userid=b.id) 
left join pro c on(b.proid=c.id) 
left join city d on(b.cityid=d.id) 
left join protype e on(a.typeid=e.id) 
where (a.pro_name like binary '%%' or a.pro_intro like binary '%%' or a.keywords like binary '%%') 
and co_type=112 and b.islock=0  and a.isdel=0 and a.comp_state=1 and b.islock=0 order by b.realtypeid desc,a.modifydate desc limit 0,20




给大家简单解释下这句,就是搜索产品列表显示页 product产品表记录6万 company是企业表 记录4万 pro是省份信息,city是城市信息,protype是产品分类信息,

主要是想搜索结果是以企业的等级排序,如果是同等级的就按产品的发布时间排序,所以就写了这么个SQL语句,不过效率真的很低,估计要6秒执行时间

我测试了下,主要原因就出在排序 order by b.realtypeid desc,a.modifydate desc 这上面

可是这个排序又必须要排,请大家帮我出出点子吧,应该怎么办!~

------解决方案--------------------
路过学习 望高手指点
------解决方案--------------------
我看一下
------解决方案--------------------
数据量比较大的时候,建议分批来取数据

试试这个会不会快一些
select a.id,b.id as mycompid,b.typeid,b.co_end,a.pro_price, a.pro_name as realproname,a.discount_rate,a.bigpic,a.temp_url,b.co_name, c.pro_name,d.city_name,a.begindate,a.modifydate,a.pro_intro from product a,company b,protype e
left join pro c on(b.proid=c.id) 
left join city d on(b.cityid=d.id) 
where a.userid=b.id and a.typeid=e.id and (a.pro_name like binary '%%' or a.pro_intro like binary '%%' or a.keywords like binary '%%') and co_type=112 and b.islock=0 and a.isdel=0 and a.comp_state=1 and b.islock=0 order by b.realtypeid desc,a.modifydate desc limit 0,20


------解决方案--------------------
b.realtypeid,a.modifydate给它们两列建立索引..
------解决方案--------------------
建议用视图!
------解决方案--------------------
如果数据太大,分步取然后用PHP处理还不不错的,在不行explain一下吧,
------解决方案--------------------
分段索引在排序吧 排序是很慢
------解决方案--------------------
你问题是出在left join上把
这么多大量数据的表进行连续left join 太大啊。。。
------解决方案--------------------
可以试试把条件常用的字段加上索引
------解决方案--------------------
(a.pro_name like binary '%%' or a.pro_intro like binary '%%' or a.keywords like binary '%%')

这个啥意思??
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn