>  기사  >  데이터 베이스  >  SQL 문제를 해결하면 MySQL에 대한 이해가 한 단계 더 발전할 것입니다!

SQL 문제를 해결하면 MySQL에 대한 이해가 한 단계 더 발전할 것입니다!

coldplay.xixi
coldplay.xixi앞으로
2020-12-26 17:42:094807검색

SQL TutorialMySQL을 더욱 효과적으로 이해하는 방법을 소개하는 칼럼

SQL 문제를 해결하면 MySQL에 대한 이해가 한 단계 더 발전할 것입니다!

권장(무료) : 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는 일대다 관계입니다.
데이터는 다음과 유사합니다.

데이터 용량이 40W 이상입니다Typeproduct_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
int

product_id

type_idintintbrand idmodel idstatus데이터는 다음과 같습니다. 다음과 유사: model_id10970
type id brand_id
model_id int
status tinyint
product_id type_id brand_id
status
1(모바일)

1(애플)1(아이폰8)1 (아이폰8 찾고 계신 모델번호는 애플9512GLoud Goldnormal제품ps: 속성 조건 세트가 10개 이상 있을 수 있습니다. 요구 사항@Kamicloud의 기존 솔루션@Elijah_Wang의 하위 쿼리 체계
1(일반) 10980 1(모바일) 1(애플)
, 메모리는 , 색상은 입니다 , 상태는 입니다. 총 개수,
성능 우선, 집계 함수 제거 등 원래 문제에 대한 솔루션의 성능 순위
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;
시간 소모 0.69- 0.72(실행 범위 10회) 분석 설명:

@Kamicloud의 기존 솔루션

        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 ))
소요 5.7-5.85(실행 범위 10회)

분석 설명:

  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 ) 
                );
5.7~6.0 소요(실행 범위 10회)
  1. 분석 설명:

  1. 단순히 속성 테이블만 찾아보면 1번이 가장 빠르지만 그 이후는 제품 상태를 확인해보니 서브쿼리만큼 속도가 좋지 않습니다.
분석 설명 후 첫 번째 하위 쿼리가 빠른 이유는 sql이 간단하고 select_type이 간단하기 때문입니다.

조인 또는 존재 방법에 관계없이 select_type은 대부분 DERIVED 및 DEPENDENT SUBQUERY입니다.
관련 무료 학습 권장사항:

SQL 性能实战来了,机不可失!

mysql 비디오 튜토리얼

위 내용은 SQL 문제를 해결하면 MySQL에 대한 이해가 한 단계 더 발전할 것입니다!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제