• 【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语句)。

  • 相关阅读:
    Binary Tree Zigzag Level Order Traversal
    Binary Tree Level Order Traversal
    Symmetric Tree
    Best Time to Buy and Sell Stock II
    Best Time to Buy and Sell Stock
    Triangle
    Populating Next Right Pointers in Each Node II
    Pascal's Triangle II
    Pascal's Triangle
    Populating Next Right Pointers in Each Node
  • 原文地址:https://www.cnblogs.com/ribavnu/p/4496760.html
Copyright © 2020-2023  润新知