zoukankan      html  css  js  c++  java
  • 【mysql】一次有意思的数据库查询分析。

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

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

    所以建了个这么个表:

    goods_chexings表

    列名依次为:车辆厂牌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语句)。

  • 相关阅读:
    码农如何通过编程赚更多的钱
    理解 OAuth 2.0 认证流程
    把同事的代码重写得干净又整洁,老板却让我做回滚?
    精读《如何做好 CodeReview》
    互联网行业的软件与人员的代际更迭随想
    十大最佳自动化测试工具
    使用 docker 高效部署你的前端应用
    在Linux 命令行中转换大小写
    Python批量检测服务器端口可用性与Socket函数使用
    基于华为云CSE微服务接口兼容常见问题
  • 原文地址:https://www.cnblogs.com/ribavnu/p/4496760.html
Copyright © 2011-2022 走看看