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 ?
PHPz
PHPz 2017-05-18 10:56:52
0
2
1122
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
PHPz
PHPz

学习是最好的投资!

répondre à tous(2)
PHPzhong

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

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.

黄舟

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.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!