使用MySQL的示例分析
这篇文章主要介绍了使用MySQL的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
属性表(product_props)结构如下
数据量800W以上
其中product_id与pn_id,pv_id是一对多的关系。
数据类似这样:
产品表(product)结构如下
数据量40W以上
数据类似以下:
问题
找出型号为苹果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的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。