Maison  >  Article  >  base de données  >  A quoi sert MySQL Explain ? (Avec explication détaillée de l'exécution)

A quoi sert MySQL Explain ? (Avec explication détaillée de l'exécution)

藏色散人
藏色散人avant
2021-10-20 15:51:572042parcourir
<p class="toc-wraper ui card column author-box grid pt-2" style="display:none"><em class="icon remove text-mute "></em>                                                                                                             </p> <h2> <span class="header-link octicon octicon-link"></span>À quoi sert Explain</h2> <p>Lorsque <code>Explain</code> est utilisé avec l'instruction <code>SQL</code>, <code>MySQL</code> affichera les informations d'exécution SQL de les informations de l'optimiseur. Autrement dit, <code>MySQL</code> explique comment il traitera l'instruction, y compris comment joindre les tables et dans quel ordre. <code>Explain</code>与<code>SQL</code>语句一起使用时,<code>MySQL</code>会显示来自优化器关于SQL执行的信息。也就是说,<code>MySQL</code>解释了它将如何处理该语句,包括如何连接表以及什么顺序连接表等。</p> <ul> <li>表的加载顺序</li> <li> <code>sql</code>的查询类型</li> <li>可能用到哪些索引,哪些索引又被实际使用</li> <li>表与表之间的引用关系</li> <li>一个表中有多少行被优化器查询<br>…..</li> </ul> <h2> <span class="header-link octicon octicon-link"></span>Explain有哪些信息</h2> <p><code>Explain</code>执行计划包含字段信息如下:分别是<code>id</code>、<code>select_type</code>、<code>table</code>、<code>partitions</code>、<code>type</code>、<code>possible_keys</code>、<code>key</code>、<code>key_len</code>、<code>ref</code>、<code>rows</code>、<code>filtered</code>、<code>Extra</code>12个字段。</p> <h2> <span class="header-link octicon octicon-link"></span>Explain执行计划详解</h2> <h3> <span class="header-link octicon octicon-link"></span>一、id</h3> <p><code>id:</code>:表示查询中执行select子句或者操作表的顺序,<strong><code>id</code>的值越大,代表优先级越高,越先执行</strong>。<code>id</code>大致会出现 3种情况:</p> <h5> <span class="header-link octicon octicon-link"></span>1、<code>id</code>相同</h5> <p>看到三条记录的<code>id</code>都相同,可以理解成这三个表为一组,具有同样的优先级,执行顺序由上而下,具体顺序由优化器决定。</p> <h5> <span class="header-link octicon octicon-link"></span>2、<code>id</code>不同</h5> <p>如果我们的<code>SQL</code>中存在子查询,那么<code>id</code>的序号会递增,<code>id</code>值越大优先级越高,越先被执行 。当三个表依次嵌套,发现最里层的子查询<code>id</code>最大,最先执行。</p> <h5> <span class="header-link octicon octicon-link"></span>3、以上两种同时存在</h5> <p>将上边的<code>SQL</code>稍微修改一下,增加一个子查询,发现<code>id</code>的以上两种同时存在。相同<code>id</code>划分为一组,这样就有三个组,同组的从上往下顺序执行,不同组<code>id</code>值越大,优先级越高,越先执行。</p> <h3> <span class="header-link octicon octicon-link"></span>二、select_type</h3> <p><code>select_type</code>:表示<code>select</code>查询的类型,主要是用于区分各种复杂的查询,例如:<code>普通查询</code>、<code>联合查询</code>、<code>子查询</code>等。</p> <h5> <span class="header-link octicon octicon-link"></span>1、SIMPLE</h5> <p><code>SIMPLE</code>:表示最简单的 select 查询语句,也就是在查询中不包含子查询或者<code>union</code>交并差集等操作。</p> <h5> <span class="header-link octicon octicon-link"></span>2、PRIMARY</h5> <p><code>PRIMARY</code>:当查询语句中包含任何复杂的子部分,最外层查询则被标记为<code>PRIMARY</code>。</p> <h5> <span class="header-link octicon octicon-link"></span>3、SUBQUERY</h5> <p><code>SUBQUERY</code>:当<code>select</code>或<code>where</code>列表中包含了子查询,该子查询被标记为:<code>SUBQUERY</code>。</p> <h5> <span class="header-link octicon octicon-link"></span>4、DERIVED</h5> <p><code>DERIVED</code>:表示包含在<code>from</code>子句中的子查询的select,在我们的<code>from</code>列表中包含的子查询会被标记为<code>derived</code>。</p> <h5> <span class="header-link octicon octicon-link"></span>5、UNION</h5> <p><code>UNION</code>:如果<code>union</code>后边又出现的<code>select</code>语句,则会被标记为<code>union</code>;若<code>union</code>包含在<code>from</code>子句的子查询中,外层<code>select</code>将被标记为<code>derived</code>。</p> <h5> <span class="header-link octicon octicon-link"></span>6、UNION RESULT</h5> <p><code>UNION RESULT</code>:代表从<code>union</code>的临时表中读取数据,而<code>table</code>列的<code><union1,4></code>表示用第一个和第四个<code>select</code>的结果进行<code>union</code>操作。</p> <h3> <span class="header-link octicon octicon-link"></span>三、table</h3> <p>查询的表名,并不一定是真实存在的表,有别名显示别名,也可能为临时表,例如上边的<code>DERIVED</code>、<code><union1,4></code></p> <ul> <li>Ordre de chargement des tables</li> <li>Types de requêtes de <code>sql</code> </li> <li>Quels index peuvent être utilisés et quels index sont réellement utilisés</li> <li> li></li> <li>Relations de référence entre les tables</li> <li>Combien de lignes d'une table sont interrogées par l'optimiseur<br>…..</li> </ul>🎜🎜Expliquez il y a Quelles informations🎜🎜Le plan d'exécution <code>Explain</code> comprend les informations de champ suivantes : <code>id</code>, <code>select_type</code>, <code>table</code>, partitions, <code>type</code>, <code>possible_keys</code>, <code>key</code>, <code>key_len</code>, <code>ref code >, <code>lignes</code>, <code>filtré</code>, <code>Extra</code>12 champs. 🎜🎜🎜🎜Expliquez l'explication détaillée du plan d'exécution🎜<h3>🎜🎜1. id</h3>🎜<code>id : </code> : indique l'ordre dans lequel les clauses de sélection ou les tables d'opérations sont exécutées dans la requête, <strong><code plus la valeur de>id</code> est grande, plus la priorité est élevée et sera exécutée en premier</strong>. <code>id</code> aura généralement trois situations : 🎜<h5>🎜🎜1 <code>id</code> est le même</h5>🎜Voir le <code>id</code> sur trois. enregistrements Ils sont tous identiques. On peut comprendre que ces trois tables sont un groupe avec la même priorité. L'ordre d'exécution est de haut en bas. L'ordre spécifique est déterminé par l'optimiseur. 🎜<h5>🎜🎜2. <code>id</code> est différent</h5>🎜S'il y a une sous-requête dans notre <code>SQL</code>, alors le numéro de série de <code>id code> sera de plus en plus élevé, plus la valeur <code>id</code> est grande, plus la priorité sera élevée et plus il sera exécuté tôt. Lorsque les trois tables sont imbriquées en séquence, on constate que la sous-requête la plus interne <code>id</code> est la plus grande et est exécutée en premier. 🎜<h5>🎜🎜3. Les deux ci-dessus existent en même temps</h5>🎜Modifiez légèrement le <code>SQL</code> ci-dessus, ajoutez une sous-requête et recherchez les deux ci-dessus de <code>id code> existent en même temps. Le même <code>id</code> est divisé en un groupe, il y a donc trois groupes. Ceux du même groupe sont exécutés séquentiellement de haut en bas. Plus la valeur <code>id</code> des différents groupes est grande. , plus la priorité est élevée et plus la priorité Exécuter en premier est élevée. 🎜<h3>🎜🎜2. select_type</h3>🎜<code>select_type</code> : Indique le type de requête <code>select</code>, principalement utilisée pour distinguer diverses requêtes complexes, telles que : Requête normale</code>, <code>Requête Union</code>, <code>Sous-requête</code>, etc. 🎜<h5>🎜🎜1. SIMPLE</h5>🎜<code>SIMPLE</code> : représente l'instruction de requête de sélection la plus simple, c'est-à-dire que la requête ne contient pas de sous-requêtes ni d'intersections <code>union</code>. Opérations telles que les ensembles d’unions et de différences. 🎜<h5>🎜🎜2, PRIMARY</h5>🎜<code>PRIMARY</code> : lorsque l'instruction de requête contient des sous-parties complexes, la requête la plus externe est marquée comme <code>PRIMARY</code> . 🎜<h5>🎜🎜3. SOUS-REQUÊTE</h5>🎜<code>SOUS-REQUÊTE</code> : Lorsque la liste <code>select</code> ou <code>where</code> contient une sous-requête, la sous-requête la requête est marquée : <code>SUBQUERY</code>. 🎜<h5>🎜🎜4, DERIVED</h5>🎜<code>DERIVED</code> : Représente la sélection de la sous-requête contenue dans la clause <code>from</code>, dans notre <code>from code>Les sous-requêtes contenues dans la liste seront marquées comme <code>dérivées</code>. 🎜<h5>🎜🎜5, UNION</h5>🎜<code>UNION</code> : Si <code>union</code> est suivi d'une instruction <code>select</code>, elle sera marquée est <code>union</code> ; si <code>union</code> est inclus dans une sous-requête de la clause <code>from</code>, le <code>select</code> externe sera marqué comme <code>dérivé</code>. 🎜<h5>🎜🎜6, UNION RESULT</h5>🎜<code>UNION RESULT</code> : représente la lecture des données de la table temporaire de <code>union</code>, et de la <code>table Le La colonne <code><union1,4></code> de la code> indique que les résultats du premier et du quatrième <code>select</code> sont utilisés pour effectuer l'opération <code>union</code>. 🎜<h3>🎜🎜3. table</h3>🎜Le nom de la table interrogé n'est pas nécessairement une vraie table. Il existe un alias pour afficher l'alias, ou il peut s'agir d'une table temporaire, comme la <code>DERIVED ci-dessus. </code> , <code><union1,4></code>, etc. 🎜<h3> <span class="header-link octicon octicon-link"></span>4. Partitions</h3> <p>Les informations de partition correspondantes lors de l'interrogation. Pour les tables non partitionnées, la valeur est <code>NULL</code> Lors de l'interrogation d'une table partitionnée, <code>partitions</code> affiche les partitions. Tableau de l'état de la partition. <code>NULL</code>,当查询的是分区表时,<code>partitions</code>显示分区表命中的分区情况。</p> <h3> <span class="header-link octicon octicon-link"></span>五、type</h3> <p><code>type</code>:查询使用了何种类型,它在<code>SQL</code>优化中是一个非常重要的指标,以下性能从好到坏依次是:<code>system</code>><code>const</code>><code>eq_ref</code>><code>ref</code>><code>ref_or_null</code>><code>index_merge</code>><code>unique_subquery</code>><code>index_subquery</code>><code>range</code>><code>index</code>><code>ALL</code></p> <h5> <span class="header-link octicon octicon-link"></span>1、system</h5> <p><code>system</code>: 当表仅有一行记录时(系统表),数据量很少,往往不需要进行磁盘IO,速度非常快。</p> <h5> <span class="header-link octicon octicon-link"></span>2、const</h5> <p><code>const</code>:表示查询时命中<code>primary key</code>主键或者<code>unique</code>唯一索引,或者被连接的部分是一个常量(<code>const</code>)值。这类扫描效率极高,返回数据量少,速度非常快。</p> <h5> <span class="header-link octicon octicon-link"></span>3、eq_ref</h5> <p><code>eq_ref</code>:查询时命中主键<code>primary key</code>或者<code>unique key</code>索引,<code>type</code>就是<code>eq_ref</code>。</p> <h5> <span class="header-link octicon octicon-link"></span>4、ref</h5> <p><code>ref</code>:区别于<code>eq_ref</code>,<code>ref</code>表示使用非唯一性索引,会找到很多个符合条件的行。</p> <h5> <span class="header-link octicon octicon-link"></span>5、ref_or_null</h5> <p><code>ref_or_null</code>:这种连接类型类似于 ref,区别在于<code>MySQL</code>会额外搜索包含<code>NULL</code>值的行。</p> <h5> <span class="header-link octicon octicon-link"></span>6、index_merge</h5> <p><code>index_merge</code>:使用了索引合并优化方法,查询使用了两个以上的索引。</p> <h5> <span class="header-link octicon octicon-link"></span>7、unique_subquery</h5> <p><code>unique_subquery</code>:替换下面的<code>IN</code>子查询,子查询返回不重复的集合。</p> <pre class="brush:php;toolbar:false">value IN (SELECT primary_key FROM single_table WHERE some_expr)</pre> <h5> <span class="header-link octicon octicon-link"></span>8、index_subquery</h5> <p><code>index_subquery</code>:区别于<code>unique_subquery</code>,用于非唯一索引,可以返回重复值。</p> <pre class="brush:php;toolbar:false">value IN (SELECT key_column FROM single_table WHERE some_expr)</pre> <h5> <span class="header-link octicon octicon-link"></span>9、range</h5> <p><code>range</code>:使用索引选择行,仅检索给定范围内的行。简单点说就是针对一个有索引的字段,给定范围检索数据。在<code>where</code>语句中使用<code>bettween...and</code>、<code><</code>、<code>></code>、<code><=</code>、<code>in</code>等条件查询<code>type</code>都是<code>range</code>。</p><h6><span class="header-link octicon octicon-link"></span>只有对设置了索引的字段,做范围检索<code>type</code>才是<code>range</code>。</h6><h5><span class="header-link octicon octicon-link"></span>10、index</h5><p><code>index</code>:<code>Index</code>与<code>ALL</code>其实都是读全表,区别在于<code>index</code>是遍历索引树读取,而<code>ALL</code>是从硬盘中读取。</p><h5><span class="header-link octicon octicon-link"></span>11、ALL</h5><p><code>ALL</code>:将遍历全表以找到匹配的行,性能最差。</p><h3><span class="header-link octicon octicon-link"></span>六、possible_keys</h3><p><code>possible_keys</code>:表示在<code>MySQL</code>中通过哪些索引,能让我们在表中找到想要的记录,一旦查询涉及到的某个字段上存在索引,则索引将被列出,<strong>但这个索引并不定一会是最终查询数据时所被用到的索引</strong>。具体请参考上边的例子。</p><h3><span class="header-link octicon octicon-link"></span>七、key</h3><p><code>key</code>:区别于<code>possible_keys</code>,key是查询中实际使用到的索引,若没有使用索引,显示为<code>NULL</code>。具体请参考上边的例子。</p><blockquote><p>当<code>type</code>为<code>index_merge</code>时,可能会显示多个索引。</p></blockquote><h3><span class="header-link octicon octicon-link"></span>八、key_len</h3><p><code>key_len</code>:表示查询用到的索引长度(字节数),原则上长度越短越好 。</p><ul><li>单列索引,那么需要将整个索引长度算进去;</li><li>多列索引,不是所有列都能用到,需要计算查询中实际用到的列。</li></ul><blockquote><p>注意:<code>key_len</code>只计算<code>where</code>条件中用到的索引长度,而排序和分组即便是用到了索引,也不会计算到<code>key_len</code></p>🎜🎜5. Type🎜🎜<code>type</code> : Quel type est utilisé dans la requête ? C'est un indicateur très important dans l'optimisation <code>SQL</code>. mauvais Dans l'ordre : <code>system</code>><code>const</code>><code>eq_ref</code>><code>ref</code>><code>ref_or_null code >><code>index_merge</code>><code>unique_subquery</code>><code>index_subquery</code>><code>range</code>><code>index code >><code>TOUS</code>🎜<h5>🎜🎜1. system</h5>🎜<code>system</code> : Lorsque la table ne comporte qu'une seule ligne d'enregistrements (table système), le la quantité de données est très faible, souvent aucune E/S disque n'est requise et la vitesse est très rapide. 🎜<h5>🎜🎜2, const</h5>🎜<code>const</code> : indique que la clé primaire <code>primary key</code> ou l'index unique <code>unique</code> est atteint pendant la requête, ou La partie concaténée est une valeur constante (<code>const</code>). Ce type d'analyse est extrêmement efficace, renvoie une petite quantité de données et est très rapide. 🎜<h5>🎜🎜3, eq_ref</h5>🎜<code>eq_ref</code> : Appuyez sur l'index de la clé primaire <code>clé primaire</code> ou de la <code>clé unique</code> pendant la requête, <code>type</code> est <code>eq_ref</code>. 🎜<h5>🎜🎜4, ref</h5>🎜<code>ref</code> : différent de <code>eq_ref</code>, <code>ref</code> signifie utiliser un index non unique, ce qui permettra de trouver de nombreuses lignes correspondantes. 🎜<h5>🎜🎜5, ref_or_null</h5>🎜<code>ref_or_null</code> : ce type de connexion est similaire à ref, la différence est que <code>MySQL</code> recherchera en plus <code> Ligne de valeur NULL. 🎜<h5>🎜🎜6, index_merge</h5>🎜<code>index_merge</code> : la méthode d'optimisation de fusion d'index est utilisée et la requête utilise plus de deux index. 🎜<h5>🎜🎜7, unique_subquery</h5>🎜<code>unique_subquery</code> : remplacez la sous-requête <code>IN</code> suivante, et la sous-requête renvoie un ensemble unique. 🎜rrreee<h5>🎜🎜8, index_subquery</h5>🎜<code>index_subquery</code> : différent de <code>unique_subquery</code>, il est utilisé pour les index non uniques et peut renvoyer des valeurs en double. 🎜rrreee<h5>🎜🎜9, range</h5>🎜<code>range</code> : sélectionnez les lignes à l'aide de l'index et récupérez uniquement les lignes dans la plage donnée. Pour faire simple, il s’agit de récupérer des données dans une plage donnée pour un champ indexé. Utilisez <code>entre...et</code>, <code><</code>, <code>></code>, <code>< dans l'instruction <code>where</code> =</code>, <code>in</code> et d'autres requêtes conditionnelles <code>type</code> sont toutes <code>range</code>. 🎜<h6>🎜🎜Seule la recherche par plage <code>type</code> pour le champ indexé est <code>range</code>. </h6> <h5>🎜🎜10, index</h5>🎜<code>index</code> : <code>Index</code> et <code>ALL</code> lisent en fait la table entière. La différence est que <code>index</code> parcourt l'arborescence d'index pour lire, tandis que <code>ALL</code> lit à partir du disque dur. 🎜<h5>🎜🎜11, ALL</h5>🎜<code>ALL</code> : la table entière sera parcourue pour trouver les lignes correspondantes, avec les pires performances. 🎜🎜🎜🎜6. possible_keys🎜🎜<code>possible_keys</code> : Indique quels index dans <code>MySQL</code> nous permettent de trouver les enregistrements souhaités dans la table une fois que la requête implique Si un index existe sur. dans un certain champ, l'index sera répertorié, <strong>mais cet index n'est pas nécessairement l'index utilisé lors de l'interrogation des données</strong>. Veuillez vous référer à l'exemple ci-dessus pour plus de détails. 🎜🎜🎜🎜7. Key🎜🎜<code>key</code> : Différent de <code>possible_keys</code>, la clé est l'index réellement utilisé dans la requête. Si aucun index n'est utilisé, il sera affiché comme. <code>NULL </code>. Veuillez vous référer à l'exemple ci-dessus pour plus de détails. 🎜<blockquote>🎜Lorsque <code>type</code> est <code>index_merge</code>, plusieurs index peuvent être affichés. 🎜</blockquote>🎜🎜🎜8. key_len🎜🎜<code>key_len</code> : Indique la longueur de l'index (nombre d'octets) utilisée dans la requête. En principe, plus la longueur est courte, mieux c'est. 🎜<ul> <li>Pour un index à une seule colonne, la longueur entière de l'index doit être incluse ; </li> <li>Pour un index à plusieurs colonnes, toutes les colonnes ne peuvent pas être utilisées, et les colonnes réelles utilisées dans la requête doit être calculée. </li> </ul> <blockquote>🎜Remarque : <code>key_len</code> calcule uniquement la longueur de l'index utilisée dans la condition <code>where</code>, et même si l'index est utilisé pour le tri et regroupement, il ne sera pas calculé dans <code>key_len</code>. 🎜</blockquote> <h3> <span class="header-link octicon octicon-link"></span>9. ref</h3> <p><code>ref</code> : les plus courants sont : <code>const</code>, <code>func</code>, <code>null</code>, champs nom. <code>ref</code>:常见的有:<code>const</code>,<code>func</code>,<code>null</code>,字段名。</p> <ul> <li>当使用常量等值查询,显示<code>const</code>,</li> <li>当关联查询时,会显示相应关联表的<code>关联字段</code> </li> <li>如果查询条件使用了<code>表达式</code>、<code>函数</code>,或者条件列发生内部隐式转换,可能显示为<code>func</code> </li> <li>其他情况<code>null</code> </li> </ul> <h3> <span class="header-link octicon octicon-link"></span>十、rows</h3> <p><code>rows</code>:以表的统计信息和索引使用情况,估算要找到我们所需的记录,需要读取的行数。</p> <p>这是评估<code>SQL</code>性能的一个比较重要的数据,<code>mysql</code>需要扫描的行数,很直观的显示<code>SQL</code>性能的好坏,一般情况下<code>rows</code>值越小越好。</p> <h3> <span class="header-link octicon octicon-link"></span>十一、filtered</h3> <p><code>filtered</code>这个是一个百分比的值,表里符合条件的记录数的百分比。简单点说,这个字段表示存储引擎返回的数据在经过过滤后,剩下满足条件的记录数量的比例。</p> <p>在<code>MySQL.5.7</code>版本以前想要显示<code>filtered</code>需要使用<code>explain extended</code>命令。<code>MySQL.5.7</code>后,默认<code>explain</code>直接显示<code>partitions</code>和<code>filtered</code>的信息。</p> <h3> <span class="header-link octicon octicon-link"></span>十二、Extra</h3> <p><code>Extra</code>:不适合在其他列中显示的信息,<code>Explain</code>中的很多额外的信息会在<code>Extra</code>字段显示。</p> <h5> <span class="header-link octicon octicon-link"></span>1、Using index</h5> <p><code>Using index</code>:我们在相应的<code>select</code>操作中使用了覆盖索引,通俗一点讲就是查询的列被索引覆盖,使用到覆盖索引查询速度会非常快,<code>SQl</code>优化中理想的状态。</p> <p>什么又是覆盖索引?</p> <p>一条<code>SQL</code>只需要通过索引就可以返回,我们所需要查询的数据(一个或几个字段),而不必通过二级索引,查到主键之后再通过主键查询整行数据(<code>select *</code>)。</p> <p><strong>注意</strong>:想要使用到覆盖索引,我们在<code>select</code>时只取出需要的字段,不可<code>select *</code>,而且该字段建了索引。</p> <h5> <span class="header-link octicon octicon-link"></span>2、Using where</h5> <p><code>Using where</code>:查询时未找到可用的索引,进而通过<code>where</code>条件过滤获取所需数据,但要注意的是并不是所有带<code>where</code>语句的查询都会显示<code>Using where</code>。</p> <h5> <span class="header-link octicon octicon-link"></span>3、Using temporary</h5> <p><code>Using temporary</code>:表示查询后结果需要使用临时表来存储,一般在排序或者分组查询时用到。</p> <h5> <span class="header-link octicon octicon-link"></span>4、Using filesort</h5> <p><code>Using filesort</code>:表示无法利用索引完成的排序操作,也就是<code>ORDER BY</code>的字段没有索引,通常这样的SQL都是需要优化的。</p> <p>如果<code>ORDER BY</code>字段有索引就会用到覆盖索引,相比执行速度快很多。</p> <h5> <span class="header-link octicon octicon-link"></span>5、Using join buffer</h5> <p><code>Using join buffer</code>:在我们联表查询的时候,如果表的连接条件没有用到索引,需要有一个连接缓冲区来存储中间结果。</p> <h5> <span class="header-link octicon octicon-link"></span>6、Impossible where</h5> <p><code>Impossible where</code>:表示在我们用不太正确的<code>where</code>语句,导致没有符合条件的行。</p> <h5> <span class="header-link octicon octicon-link"></span>7、No tables used</h5> <p><code>No tables used</code>:我们的查询语句中没有<code>FROM</code>子句,或者有<code>FROM DUAL</code>子句。</p> <p><code>Extra</code>列的信息非常非常多,这里就不再一一列举了,详见<code>MySQL</code></p> <ul> <li>Lors de l'utilisation d'une requête équivalente constante, <code>const</code> sera affiché </li> <li>Lors de l'exécution d'une requête associée, le <code>champ associé</code> du correspondant. la table associée sera affichée. ></li> <li>Si la condition de requête utilise une <code>expression</code>, une <code>fonction</code> ou si la colonne de condition subit une conversion implicite interne, elle peut être affichée. comme <code>func</code> code></li> <li>Autres situations <code>null</code> </li> </ul></code></code></code></code></p> <p><img src="https://img.php.cn/upload/article/000/000/020/5cc4fdf22f28d8552a4eb8b088117835-0.png" alt="">10 lignes</p> <h2><code>lignescode> : informations statistiques sur le tableau et utilisation de l'index, estimant le nombre de lignes à lire pour trouver les enregistrements dont nous avons besoin. <span class="header-link octicon octicon-link"></span>Il s'agit d'une donnée importante pour évaluer les performances de <code>SQL</code>. Le nombre de lignes que <code>mysql</code> doit analyser est un affichage très intuitif des performances de <code>SQL. </code> Mauvais, généralement plus la valeur <code>rows</code> est petite, mieux c'est. </code></h2> <p></p> <p>11. filtered</p> <p><code>filtered</code>Il s'agit d'une valeur en pourcentage, qui est le pourcentage du nombre d'enregistrements dans la table qui remplissent les conditions. Pour faire simple, ce champ représente la proportion des enregistrements restants qui remplissent les conditions après filtrage des données renvoyées par le moteur de stockage. </p> <p>Avant la version <code>MySQL.5.7</code>, si vous souhaitez afficher <code>filtré</code>, vous devez utiliser la commande <code>explain extend</code>. Après <code>MySQL.5.7</code>, par défaut <code>explain</code> affiche directement les informations des <code>partitions</code> et <code>filtrées</code>. </p>🎜🎜🎜Douze, Extra🎜🎜<code>Extra</code> : informations qui ne peuvent pas être affichées dans d'autres colonnes, de nombreuses informations supplémentaires dans <code>Expliquer</code> seront affichées dans <code> Extra s'affiche. 🎜<h5>🎜🎜1. Utilisation de l'index</h5>🎜<code>Utilisation de l'index</code> : Nous utilisons l'index de couverture dans l'opération <code>select</code> correspondante. En termes simples, il s'agit d'une requête. La colonne est couverte par l'index et la vitesse de requête sera très rapide en utilisant l'index de couverture, ce qui est un état idéal dans l'optimisation <code>SQl</code>. 🎜🎜Qu'est-ce qu'un index de couverture ?🎜🎜Un morceau de <code>SQL</code> ne peut être renvoyé que via l'index. Les données que nous devons interroger (un ou plusieurs champs) ne doivent pas nécessairement passer par l'index secondaire. . Après la clé primaire, interrogez la ligne entière de données via la clé primaire (<code>select *</code>). 🎜🎜<strong>Remarque</strong> : Si nous voulons utiliser l'index de couverture, nous supprimons uniquement les champs obligatoires lorsque <code>select</code>, pas <code>select *</code>, et le champ est créé indexé. 🎜<h5>🎜🎜2. Utilisation de Where</h5>🎜<code>Utilisation de Where</code> : aucun index disponible n'est trouvé lors de la requête et les données requises sont obtenues via le filtrage conditionnel <code>where</code>. . Mais il convient de noter que toutes les requêtes avec des instructions <code>where</code> n'afficheront pas <code>Usingwhere</code>. 🎜<h5>🎜🎜3. Utilisation de temporaire</h5>🎜<code>Utilisation de temporaire</code> : Indique que les résultats de la requête doivent être stockés dans une table temporaire, qui est généralement utilisée lors du tri ou du regroupement des requêtes. 🎜<h5>🎜🎜4. Utilisation du tri de fichiers</h5>🎜<code>Utilisation du tri de fichiers</code> : Indique que l'opération de tri ne peut pas être effectuée à l'aide de l'index, c'est-à-dire du champ de <code>ORDER BYcode> n'a pas d'index. Généralement, un tel SQL doit être optimisé. 🎜🎜Si le champ <code>ORDER BY</code> a un index, un index de couverture sera utilisé, ce qui est beaucoup plus rapide que l'exécution. 🎜<h5>🎜🎜5. Utilisation du tampon de jointure</h5>🎜<code>Utilisation du tampon de jointure</code> : Lorsque nous interrogeons des tables conjointes, si les conditions de jointure de la table n'utilisent pas d'index, nous avons besoin d'un tampon de jointure. zone pour stocker les résultats intermédiaires. 🎜<h5>🎜🎜6. Impossible Where</h5>🎜<code>Impossible Where</code> : cela signifie que nous utilisons une instruction <code>where</code> incorrecte, ce qui entraîne qu'aucune ligne ne remplisse les conditions. . 🎜<h5>🎜🎜7. Aucune table utilisée</h5>🎜<code>Aucune table utilisée</code> : Il n'y a pas de clause <code>FROM</code> dans notre instruction de requête, ou il y a <code> Clause FROM DUAL</code>. 🎜🎜 Il y a beaucoup d'informations dans la colonne <code>Extra</code>, je ne les listerai donc pas toutes ici. Pour plus de détails, consultez le document officiel <code>MySQL</code> : https://. dev.mysql.com/doc /ref…🎜🎜🎜🎜🎜🎜🎜 Résumé🎜🎜Colonnes clés : 🎜🎜possible_keys : les noms des index qui peuvent être disponibles. Le nom de l'index est ici le pseudo de l'index spécifié lors de la création de l'index ; si l'index n'a pas de pseudo, le nom de la première colonne de l'index est affiché par défaut (dans cet exemple, il s'agit de « prénom »). La signification des noms d’index par défaut n’est souvent pas évidente. 🎜🎜key : Elle affiche le nom de l'index réellement utilisé par MySQL. S'il est vide (ou NULL), MySQL n'utilise pas l'index. 🎜🎜key_len : La longueur de la partie utilisée de l'index, en octets🎜<p>ref : Si la liste est filtrée (par clé) <br> par une constante (const) ou un champ d'une certaine table (s'il s'agit d'une jointure) </p> <p>rows : ce que MySQL pense devoir faire avant de pouvoir trouver la bonne ; résultat. Le nombre d’enregistrements analysés. Évidemment, le nombre idéal ici est 1. </p> <p>Apprentissage recommandé : "<a href="https://www.php.cn/course/list/51.html" target="_blank">tutoriel vidéo mysql</a>"<br></p></code></code></code></code></code></code>

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer