mysql查询数据分析_【mysql】一次有意思的数据库查询分析。

本文讨论了一家汽车配件电商网站后端PHP代码中的查询问题。当在List.php页面上进行配件搜索时,由于未指定查询条件时仍进行全表扫描,导致查询效率低下,等待时间长达10秒。作者分析了数据库表结构和查询语句,并发现即使在goods_chexings表上有索引,全表扫描也会发生。通过修改SQL语句,仅在存在查询条件时加入JOIN操作,显著提高了查询速度。优化后的查询等待时间降低至零点几秒。
摘要由CSDN通过智能技术生成

本文是在做一家汽车配件的电商网站时,大体情景是一个List.php页面,该页面分页列出部分配件并统计总数量用于分页。

当然该页面中也可以指定一下查询条件,如适配的车辆品牌、车系、排量、年份等,一件商品可能适配多种车辆。

所以建了个这么个表:

goods_chexings表

fwRn4WFE28CJAAAAAElFTkSuQmCC

列名依次为:车辆厂牌id,车系id,排量id,车型id(该车型的说法不太规范,客户给的数据里边就叫车型,就这么将就着用了,实际是年份的字符串如哪年开始到哪年结束),配件的id(该id源于good表)。

车辆厂牌id,车系id,排量id,车型id存在着层级关系,层级为:车辆厂牌id -> 车系id ->  排量id -> 车型id,表这么建算是为了方便查找吧,有时候只指定到厂牌或者车系,让你列出来适配的配件。

。。。冗余,冗余哈,查找方便。

上PHP后端代码哈:

查找时候的where子句:

//carBrand //品牌

//carXi //车系

//carXing//排量 //命名不规范。。。凑合看一下吧

//carYear//车型

// $carBrand,$carXi,$carXing,$carYear

$carBrand = intval($_GET['carBrand']);

if(!empty($carBrand))

{

$where .=' and (E.changpai_id ='.$carBrand. ' or E.changpai_id =0 )';

}

$carXi = intval($_GET['carXi']);

if(!empty($carXi))

{

$where .=' and (E.chexi_id ='.$carXi. ' or E.chexi_id =0 )';

}

$carXing = intval($_GET['carXing']);

if(!empty($carXing))

{

$where .=' and (E.pailiang_id ='.$carXing. ' or E.pailiang_id =0 )';

}

$carYear = intval($_GET['carYear']);

if(!empty($carYear))

{

$where .=' and (E.chexing_id ='.$carYear. ' or E.chexing_id =0 )';

}

然后select的主体

$goods_sql = 'select distinct(A.goods_id), A.name,A.pics,D.cat_name '

. ' from goods A left '

.' left join goods_cat D on A.goods_top_id=D.cat_id ' ;

. 'left join goods_chexings E on A.goods_id = E.good_id '

.$where.' order by '.$sort_by.' limit '.$limit;

大体说下goods表和goods_chexings表的数量级:goods几千条,goods_chexings几万条。

但是List.php页面,如果什么条件都不指定的话,Waiting Time大约得10s,亮了。。。。

如果随便指定个车系、厂牌啥的,Waiting Time大约也就零点几秒的,也亮了。。。。

补充一下,goods_chexings表上有索引的。。。。

看到这能猜到时间差距为啥那么大了吧。。。。不指定查询条件时join goods_chexings根本就没用,只查询goods表就行了。

没指定查询条件 goods_chexings表上有索引根本就不起作用,全表扫描。。。。

修改后的查询:

$goods_sql = 'select distinct(A.goods_id), A.name,A.pics,D.cat_name '

.' from goods A left '

.' left join goods_cat D on A.goods_top_id=D.cat_id ' ;

if(!(empty($carBrand) && empty($carXi) && empty($carXing) && empty($carYear) ))

{

$sql .= 'left join mega_good_chexi E on A.goods_id = E.good_id ';

}

$sql.= $where.' order by '.$sort_by.' limit '.$limit;

备注:写统配的sql语句写习惯了,不管查询的时候起不起作用,可能使用到的表先from或者join了,

如果出现要查询的条件时就加在where子句里边。。。。。引起的索引不起作用,全表扫描了。

用到的mysql的分析命令:EXPLAIN extended   (SQL语句)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值