SQL TutorialMySQL을 더욱 효과적으로 이해하는 방법을 소개하는 칼럼
권장(무료) : SQL Tutorial
속성 테이블(product_props) 구조는 다음과 같습니다.
데이터 볼륨 800W 이상
필드 이름 | 유형 | 설명 |
---|---|---|
id | int | id |
pn _id | int | 속성 유형 |
pv_id | int | 속성 값 |
product_id | int | Product ID |
여기서 product_id, pn_id, pv_id는 일대다 관계입니다.
데이터는 다음과 유사합니다.
product_id | pn_id | pv_id |
---|---|---|
10970 | 5(모델) | 135(Apple 9) |
10970 | 11(메모리 ) | 23(512G) |
10970 | 10(컬러) | 17(로컬 골드) |
10970 | 8(네트워크) | 6(5G) |
10980 | 5 | 135 제품(product) 구조는 다음과 같습니다 |
Field name | ||
Description |
product_id
type_idtype id | brand_id | |
---|---|---|
model_id | int | |
status | tinyint | |
데이터는 다음과 같습니다. 다음과 유사: | ||
product_id | type_id | brand_id |
status |
1(일반) | 10980 | 1(모바일) | 1(애플) | |
---|---|---|---|---|
, 메모리는 | 512G, 색상은 입니다 | Loud Gold, 상태는 | normal입니다. 총 | 제품개수, | ps: 속성 조건 세트가 10개 이상 있을 수 있습니다.
성능 우선, 집계 함수 제거 등 | 원래 문제에 대한 솔루션의 성능 순위 | |||
SELECT sql_no_cache `product_id` FROM `zx_tests` AS a WHERE `pn_id` = 101 AND `pv_id` = 59 AND EXISTS( SELECT sql_no_cache * FROM `zx_tests` WHERE a.product_id = product_id and `pn_id` = 101 AND `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` = 5 AND `pv_id` = 135 AND `product_id` IN (SELECT `product_id` FROM `product` WHERE `pn_id` = 11 AND `pv_id` = 23); 2 组条件下 0.729,3 组 0.75,4 组 0.730,5 组 0.757 (新问题之前)
시간 소모 1.5-1.56(실행 범위 10회)
설명 분석:
select SQL_NO_CACHE count(1) from pdi_product a join ( SELECT distinct product_id FROM `product_props` WHERE `pn_id` = 5 AND `pv_id` = 127 AND `product_id` IN ( SELECT `product_id` FROM `product_props` WHERE `pn_id` = 11 AND `pv_id` = 22 ) AND `product_id` IN ( SELECT `product_id` FROM `product_props` WHERE `pn_id` = 10 AND `pv_id` = 18 ) AND `product_id` IN ( SELECT `product_id` FROM `product_props` WHERE `pn_id` = 8 AND `pv_id` = 6 ) AND `product_id` IN ( SELECT `product_id` FROM `product_props` WHERE `pn_id` = 9 AND `pv_id` = 1 ) ) b on a.product_id = b.product_id where a.status = 1;
select SQL_NO_CACHE count(1) from pdi_product a
where a.status = 1 and a.product_id in (SELECT
distinct product_id
FROM
`product_props`
WHERE
`pn_id` = 5
AND `pv_id` = 127
AND `product_id` IN ( SELECT `product_id` FROM `product_props` WHERE `pn_id` = 11 AND `pv_id` = 22 )
AND `product_id` IN ( SELECT `product_id` FROM `product_props` WHERE `pn_id` = 10 AND `pv_id` = 18 )
AND `product_id` IN ( SELECT `product_id` FROM `product_props` WHERE `pn_id` = 8 AND `pv_id` = 6 )
AND `product_id` IN ( SELECT `product_id` FROM `product_props` WHERE `pn_id` = 9 AND `pv_id` = 1 ))
분석 설명:
SELECT SQL_NO_CACHE count(1) FROM product a WHERE a.STATUS = 1 AND a.product_id IN ( SELECT DISTINCT `product_id` FROM `product_props` AS a WHERE a.`pn_id` = 5 AND a.`pv_id` = 127 AND EXISTS ( SELECT product_id FROM `product_props` WHERE a.product_id = product_id AND `pn_id` = 11 AND `pv_id` = 22 ) AND EXISTS ( SELECT product_id FROM `product_props` WHERE a.product_id = product_id AND `pn_id` = 10 AND `pv_id` = 18 ) AND EXISTS ( SELECT product_id FROM `product_props` WHERE a.product_id = product_id AND `pn_id` = 9 AND `pv_id` = 1 ) AND EXISTS ( SELECT product_id FROM `product_props` WHERE a.product_id = product_id AND `pn_id` = 8 AND `pv_id` = 6 ) );
위 내용은 SQL 문제를 해결하면 MySQL에 대한 이해가 한 단계 더 발전할 것입니다!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!