这篇文章主要介绍了使用MySQL的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

属性表(product_props)结构如下

数据量800W以上

字段名类型说明idintidpn_idint属性类型pv_idint属性值product_idint产品ID

其中product_id与pn_id,pv_id是一对多的关系。
数据类似这样:

product_idpn_idpv_id109705 (型号)135 (苹果9)1097011 (内存)23 (512G)1097010 (颜色)17 (土豪金)109708 (网络)6(5G)109805135109801124 (1024G)109801016 (极光蓝)

产品表(product)结构如下

数据量40W以上

字段名类型说明product_idintproduct_idtype_idint类型idbrand_idint品牌idmodel_idint型号idstatustinyint状态

数据类似以下:

product_idtype_idbrand_idmodel_idstatus109701(手机)1(苹果)1(Iphone8)1(正常)109801(手机)1(苹果)1(Iphone8X)3(已售)109811(手机)1(苹果)1(Iphone8XP)1(正常)

问题

找出型号为苹果9同时内存为512G,颜色为土豪金,状态为正常的产品总数,
ps : 属性条件可能会有超过10组。

要求

性能第一,杜绝聚合函数等

原问题的解决方案性能排行

来自 @Kamicloud的 exist方案

SELECTsql_no_cache`product_id`FROM`zx_tests`ASaWHERE`pn_id`=101AND`pv_id`=59ANDEXISTS(SELECTsql_no_cache*FROM`zx_tests`WHEREa.product_id=product_idand`pn_id`=101AND`pv_id`=171);2组条件下0.657,3组0.695,4组0.759,5组0.743(单独查属性表)

来自 @Elijah_Wang的子查询方案

SELECT`product_id`FROM`product`WHERE`pn_id`=5AND`pv_id`=135AND`product_id`IN(SELECT`product_id`FROM`product`WHERE`pn_id`=11AND`pv_id`=23);2组条件下0.729,3组0.75,4组0.730,5组0.757(新问题之前)

新问题之后的性能排行

来自 @Elijah_Wang的子查询方案

selectSQL_NO_CACHEcount(1)frompdi_productajoin(SELECTdistinctproduct_idFROM`product_props`WHERE`pn_id`=5AND`pv_id`=127AND`product_id`IN(SELECT`product_id`FROM`product_props`WHERE`pn_id`=11AND`pv_id`=22)AND`product_id`IN(SELECT`product_id`FROM`product_props`WHERE`pn_id`=10AND`pv_id`=18)AND`product_id`IN(SELECT`product_id`FROM`product_props`WHERE`pn_id`=8AND`pv_id`=6)AND`product_id`IN(SELECT`product_id`FROM`product_props`WHERE`pn_id`=9AND`pv_id`=1))bona.product_id=b.product_idwherea.status=1;

耗时1.5-1.56 (执行10次的范围)

expain分析:

selectSQL_NO_CACHEcount(1)frompdi_productawherea.status=1anda.product_idin(SELECTdistinctproduct_idFROM`product_props`WHERE`pn_id`=5AND`pv_id`=127AND`product_id`IN(SELECT`product_id`FROM`product_props`WHERE`pn_id`=11AND`pv_id`=22)AND`product_id`IN(SELECT`product_id`FROM`product_props`WHERE`pn_id`=10AND`pv_id`=18)AND`product_id`IN(SELECT`product_id`FROM`product_props`WHERE`pn_id`=8AND`pv_id`=6)AND`product_id`IN(SELECT`product_id`FROM`product_props`WHERE`pn_id`=9AND`pv_id`=1))

耗时0.69-0.72(执行10次的范围)

explain分析:

来自 @Kamicloud的 exist方案

SELECTSQL_NO_CACHEcount(1)FROMproductaWHEREa.STATUS=1ANDa.product_idIN(SELECTDISTINCT`product_id`FROM`product_props`ASaWHEREa.`pn_id`=5ANDa.`pv_id`=127ANDEXISTS(SELECTproduct_idFROM`product_props`WHEREa.product_id=product_idAND`pn_id`=11AND`pv_id`=22)ANDEXISTS(SELECTproduct_idFROM`product_props`WHEREa.product_id=product_idAND`pn_id`=10AND`pv_id`=18)ANDEXISTS(SELECTproduct_idFROM`product_props`WHEREa.product_id=product_idAND`pn_id`=9AND`pv_id`=1)ANDEXISTS(SELECTproduct_idFROM`product_props`WHEREa.product_id=product_idAND`pn_id`=8AND`pv_id`=6));

耗时5.7-5.85 (执行10次的范围)

explain分析:

SELECTSQL_NO_CACHEcount(1)FROMpdi_productajoin(SELECTDISTINCT`product_id`FROM`product_props`ASaWHEREa.`pn_id`=5ANDa.`pv_id`=127ANDEXISTS(SELECTproduct_idFROM`product_props`WHEREa.product_id=product_idAND`pn_id`=11AND`pv_id`=22)ANDEXISTS(SELECTproduct_idFROM`product_props`WHEREa.product_id=product_idAND`pn_id`=10AND`pv_id`=18)ANDEXISTS(SELECTproduct_idFROM`product_props`WHEREa.product_id=product_idAND`pn_id`=9AND`pv_id`=1)ANDEXISTS(SELECTproduct_idFROM`product_props`WHEREa.product_id=product_idAND`pn_id`=8AND`pv_id`=6))bona.product_id=b.product_idWHEREa.STATUS=1

耗时5.7-6.0(执行10次的范围)

explain分析:


可以看到如果单纯查属性表,第一位的速度是最快的,可要查产品状态后,速度反而不如子查询。

经explain分析,第一个子查询速度之所以快是因为它的sql简单,select_type皆为simple。

而不管是join还是exists的方式,select_type大多为DERIVED,DEPENDENT SUBQUERY。

感谢你能够认真阅读完这篇文章,希望小编分享的“使用MySQL的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!