【mysql】一次有意思的数据库查询分析。
2015-05-12 11:08
495 查看
本文是在做一家汽车配件的电商网站时,大体情景是一个List.php页面,该页面分页列出部分配件并统计总数量用于分页。
当然该页面中也可以指定一下查询条件,如适配的车辆品牌、车系、排量、年份等,一件商品可能适配多种车辆。
所以建了个这么个表:
goods_chexings表
列名依次为:车辆厂牌id,车系id,排量id,车型id(该车型的说法不太规范,客户给的数据里边就叫车型,就这么将就着用了,实际是年份的字符串如哪年开始到哪年结束),配件的id(该id源于good表)。
车辆厂牌id,车系id,排量id,车型id存在着层级关系,层级为:车辆厂牌id -> 车系id -> 排量id -> 车型id,表这么建算是为了方便查找吧,有时候只指定到厂牌或者车系,让你列出来适配的配件。
。。。冗余,冗余哈,查找方便。
上PHP后端代码哈:
查找时候的where子句:
然后select的主体
大体说下goods表和goods_chexings表的数量级:goods几千条,goods_chexings几万条。
但是List.php页面,如果什么条件都不指定的话,Waiting Time大约得10s,亮了。。。。
如果随便指定个车系、厂牌啥的,Waiting Time大约也就零点几秒的,也亮了。。。。
补充一下,goods_chexings表上有索引的。。。。
看到这能猜到时间差距为啥那么大了吧。。。。不指定查询条件时join goods_chexings根本就没用,只查询goods表就行了。
没指定查询条件 goods_chexings表上有索引根本就不起作用,全表扫描。。。。
修改后的查询:
备注:写统配的sql语句写习惯了,不管查询的时候起不起作用,可能使用到的表先from或者join了,
如果出现要查询的条件时就加在where子句里边。。。。。引起的索引不起作用,全表扫描了。
用到的mysql的分析命令:EXPLAIN extended (SQL语句)。
当然该页面中也可以指定一下查询条件,如适配的车辆品牌、车系、排量、年份等,一件商品可能适配多种车辆。
所以建了个这么个表:
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语句)。
相关文章推荐
- mysql的优化(表的设计,优化步骤,四种索引,分析慢查询,使用索引的深入解析,存储引擎分析,表的分割,数据库配置)
- Mysql查询语句使用select.. for update导致的数据库死锁分析
- 一次mysql慢查询事故分析
- 数据库表设计时一对一关系存在的必要性 数据库一对一、一对多、多对多设计 面试逻辑题3.31 sql server 查询某个表被哪些存储过程调用 DataTable根据字段去重 .Net Core Cors中间件解析 分析MySQL中哪些情况下数据库索引会失效
- Mysql查询语句使用select.. for update导致的数据库死锁分析
- mysql 用多次查询代替一次复杂join查询的优点分析
- 利用mysql report 分析数据库
- mysql性能优化-慢查询分析、优化索引和配置
- MYSQl left join 联合查询效率分析
- MySQL查询特定数据库中所有为空的表
- 数据库能链接成功,但是mysql_query 无法查询表格
- mysql性能优化(九) mysql慢查询分析、优化索引和配置
- 查询数据库当前用户连接信息(MySQL,Oracle)
- mysql 初级操作-查询数据库时间
- MySQL集群:主从数据库配置 实现查询负载
- MySQL查询大小写是否敏感问题分析
- 数据库的查询优化方法分析
- 【MySQL笔记】数据库的查询
- mysql limit查询优化分析
- mysql 查询数据库中的存储过程与函数的语句