Maison  >  Questions et réponses  >  le corps du texte

mysql - Pour ces deux instructions SQL, l'une utilise or et l'autre utilise union all. Les performances devraient être meilleures que cette dernière, n'est-ce pas ?

explain select * from ecs_ad where ad_id =1 or ad_id = 3;
+----+-------------+--------+-------+---------------+---------+---------+------+------+-----------------------+
| id | select_type | table  | type  | possible_keys | key     | key_len | ref  | rows | Extra                 |
+----+-------------+--------+-------+---------------+---------+---------+------+------+-----------------------+
|  1 | SIMPLE      | ecs_ad | range | PRIMARY       | PRIMARY | 2       | NULL |    2 | Using index condition |
+----+-------------+--------+-------+---------------+---------+---------+------+------+-----------------------+
1 row in set

C'est l'union pour tous

explain select * from ecs_ad where ad_id = 4 union all select * from ecs_ad where ad_id = 3;
+------+--------------+------------+-------+---------------+---------+---------+-------+------+-----------------+
| id   | select_type  | table      | type  | possible_keys | key     | key_len | ref   | rows | Extra           |
+------+--------------+------------+-------+---------------+---------+---------+-------+------+-----------------+
|    1 | PRIMARY      | ecs_ad     | const | PRIMARY       | PRIMARY | 2       | const |    1 | NULL            |
|    2 | UNION        | ecs_ad     | const | PRIMARY       | PRIMARY | 2       | const |    1 | NULL            |
| NULL | UNION RESULT | <union1,2> | ALL   | NULL          | NULL    | NULL    | NULL  | NULL | Using temporary |
+------+--------------+------------+-------+---------------+---------+---------+-------+------+-----------------+
3 rows in set
PHPzPHPz2681 Il y a quelques jours1123

répondre à tous(2)je répondrai

  • PHPz

    PHPz2017-05-18 10:58:52

    Tout d'abord, l'écart de performances entre ces deux requêtes ne devrait pas être grand.
    Parce que la colonne ad_id est la clé primaire.

    Selon l'analyse de la colonne de type :
    ou requête, type : rangetype:range
    union all 查询:type:const / const / ALL

    首先可以确认的是,const 要优于 range.
    const 也是因为 ad_id 为主键.

    但是 union all 做了三次操作,两次主键或者唯一索引查询 type:const,但最后组合到一起时 type:ALL
    type:ALL 本身性能比 range 还要差

    从 Type 看,or 查询性能应该更好.

    Extra 分析
    or 查询:Using index condition
    union all 查询:NULL / NULL / Using temporaryunion all query : type : const / const / TOUS

    La première chose qui peut être confirmée est que const est meilleur que range.

    const c'est aussi parce que ad_id est la clé primaire.#🎜 🎜#

    Mais union all effectue trois opérations, deux requêtes de clé primaire ou d'index unique, tapez: const, mais une fois finalement combinées, tapez: ALL

    type:ALL lui-même a de moins bonnes performances que range

    Du point de vue du type, les performances des requêtes ou devraient être meilleures.


    Analyse supplémentaire

    ou requête : Utilisation de la condition d'indexation
    union all query : NULL / NULL / Utilisation temporaire

    L'utilisation de la condition d'index est une fonctionnalité nouvellement ajoutée après la version MySQL 5.6, la poussée des conditions d'index.

    Tout d'abord, parlons du processus de traitement lorsqu'il n'y a pas de condition d'index à pousser :


    Lorsque l'optimiseur n'utilise pas ICP, le processus d'accès et d'extraction des données est le suivant :

    1) Lorsque le moteur de stockage lit la ligne suivante, il lit d'abord le tuple d'index, puis utilise le tuple d'index pour localiser et lire la ligne entière de données dans la table de base.

    2) La couche serveur évalue la condition Where. Si la ligne de données satisfait à la condition Where, elle sera utilisée, sinon elle sera supprimée.
    3) Exécutez 1) jusqu'à la dernière ligne de données.



    Le flux de traitement lorsqu'il y a un push de condition d'index :

    Lorsque l'optimiseur utilise ICP, la couche serveur abaissera les conditions Where qui peuvent être évaluées en utilisant l'index de la couche moteur de stockage. Le processus d'accès et d'extraction des données est le suivant :


    1) Le moteur de stockage lit le tuple d'index suivant à partir de l'index.

    2) Le moteur de stockage utilise des tuples d'index pour évaluer les conditions de l'index pushdown. Si la condition Where n'est pas remplie, le moteur de stockage traitera le tuple d'index suivant (retour à l'étape précédente). Ce n'est que lorsque le tuple d'index répond à la condition d'index déroulant que les données continuent à être lues à partir de la table de base.

    3) Si la condition d'index déroulant est remplie, le moteur de stockage localise la ligne de la table de base via le tuple d'index et lit la ligne entière de données et la renvoie à la couche serveur. 4) L'évaluation de la couche serveur n'est pas poussée jusqu'à la condition Where de la couche moteur de stockage. Si la ligne de données satisfait à la condition Where, elle sera utilisée, sinon elle sera supprimée.

    #🎜🎜#Pour faire simple, lorsqu'il n'y a pas d'ICP, le moteur de stockage renvoie toutes les lignes de données qui remplissent les conditions et effectue un filtrage des conditions Where au niveau de la couche de service. #🎜🎜#Lorsqu'il y a ICP, la condition Where est transmise à la couche du moteur de stockage, et le moteur de stockage renvoie directement les données qui remplissent la condition. #🎜🎜#Les performances s'amélioreront naturellement beaucoup. #🎜🎜# #🎜🎜#Pour une introduction connexe à l'ICP, vous pouvez consulter ici#🎜🎜# #🎜🎜#L'utilisation de temporaire représente une table temporaire implicite, ce qui signifie que MySQL générera une table temporaire pour stocker les données intermédiaires. Parce que l'union est une relation dans laquelle ils sont traités séparément et fusionnés à la fin. #🎜🎜#Depuis Extra, cela devrait aussi être cela ou les performances des requêtes sont plus élevées. #🎜🎜# #🎜🎜##🎜🎜# Dans l'ensemble : les performances de la requête OR devraient être meilleures que celles de UNION ALL.#🎜🎜##🎜🎜#

    Étant donné que les performances de toutes les requêtes changent à mesure que la quantité de données augmente, l'analyse ci-dessus ne prend en compte que les résultats de l'analyse Explain publiés par le sujet. Cela ne veut pas dire que OR est meilleur que UNION ALL dans toutes les situations.

    Ce qui précède sont des opinions personnelles, veuillez me corriger s'il y a des erreurs.

    répondre
    0
  • 黄舟

    黄舟2017-05-18 10:58:52

    Il n'y a aucune différence entre ces deux phrases.
    Généralement, lorsque OR connecte deux champs différents et que l'index ne peut pas être utilisé, les performances seront médiocres et pas aussi bonnes que l'union. Vous pouvez essayer de le modifier.

    répondre
    0
  • Annulerrépondre