Maison > base de données > SQL > La résolution des problèmes SQL fera certainement progresser votre compréhension de MySQL !

La résolution des problèmes SQL fera certainement progresser votre compréhension de MySQL !

coldplay.xixi
Libérer: 2020-12-26 17:42:09
avant
4873 Les gens l'ont consulté

La colonne

Tutoriel SQL présente comment comprendre MySQL plus efficacement

La résolution des problèmes SQL fera certainement progresser votre compréhension de MySQL !

Recommandé (gratuit) : Tutoriel SQL

La structure de la table attributaire (product_props) est la suivante

Le le volume de données est supérieur à 800 W

字段名 类型 说明
id int id
pn_id int 属性类型
pv_id int 属性值
product_id int 产品ID

Le product_id, pn_id et pv_id sont des relations un-à-plusieurs.
Les données sont similaires à ceci :

product_id pn_id pv_id
10970 5  (型号) 135 (苹果9)
10970 11    (内存) 23 (512G)
10970 10    (颜色) 17 (土豪金)
10970 8    (网络) 6(5G)
10980 5 135
10980 11 24 (1024G)
10980 10 16 (极光蓝)

La structure de la table des produits (produit) est la suivante

Le volume de données est supérieur à 40W

字段名 类型 说明
product_id int product_id
type_id int 类型id
brand_id int 品牌id
model_id int 型号id
status tinyint 状态

Les données sont similaires ci-dessous :

product_id type_id brand_id model_id status
10970 1(手机) 1(苹果) 1(Iphone8) 1(正常)
10980 1(手机) 1(苹果) 1(Iphone8X) 3(已售)
10981 1(手机) 1(苹果) 1(Iphone8XP) 1(正常)

Question

Découvrez que le modèle est Apple 9 et la mémoire est 512G, et la couleur est Or local, le nombre total de produits avec statut normal,
ps : Il peut y avoir plus de 10 groupes de conditions d'attribut.

Exigences

La performance d'abord, éviter les fonctions d'agrégation, etc.

Classement des performances des solutions au problème d'origine

  1. Schéma existant de @Kamicloud

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

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 (单独查属性表)

Copier après la connexion
  1. Schéma de sous-requête de @Elijah_Wang

1

2

3

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 (新问题之前)

Copier après la connexion

Classement des performances après une nouvelle question

  1. Schéma de sous-requête de @Elijah_Wang

1

2

3

4

5

6

7

8

9

10

11

12

13

14

    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;

Copier après la connexion

Prendre 1,5-1,56 (plage d'exécution 10 fois)

  • analyse expain :

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

1

2

3

4

5

6

7

8

9

10

11

12

        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 ))

Copier après la connexion

prend 0,69-0,72 (plage d'exécution 10 fois)

  • expliquer l'analyse :
    SQL 性能实战来了,机不可失!
  1. solution existante de @Kamicloud

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

    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 ) 

            );

Copier après la connexion

A pris 5,7-5,85 (plage de 10 exécutions)

  • expliquer l'analyse :

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

    SELECT SQL_NO_CACHE

        count(1) 

    FROM

        pdi_product a

        join (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 ) ) b

    on a.product_id = b.product_id

    WHERE

        a.STATUS = 1

Copier après la connexion

Il faut 5,7-6,0 (plage d'exécution 10 fois)

  • expliquer l'analyse :

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


Vous pouvez voir que si vous vérifiez simplement la table attributaire, la vitesse de la première position est la plus rapide, mais lorsque vous souhaitez vérifier l'état du produit, la vitesse n'est pas aussi bonne que la sous-requête .

Après l'analyse expliquée, la raison pour laquelle la première sous-requête est rapide est que son SQL est simple et que le select_type est simple.

Quelle que soit la méthode join ou exist, select_type est principalement une SOUS-REQUÊTE DERIVED et DEPENDENT.

Recommandations d'apprentissage gratuites associées : Tutoriel vidéo MySQL

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:learnku.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal