Maison > Questions et réponses > le corps du texte
1 2 3 4 5 6 7 8 |
|
C'est l'union pour tous
1 2 3 4 5 6 7 8 9 |
|
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 : range
type: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 temporary
union 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 rangeunion all query :Du point de vue du type, les performances des requêtes ou devraient être meilleures.
ou requête :
Analyse supplémentaireUtilisation de la condition d'indexation
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épondre0

黄舟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épondre0
Annuler