<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>Wozu dient Explain?</h2>
<p>Wenn <code>Explain</code> mit der <code>SQL</code>-Anweisung verwendet wird, zeigt <code>MySQL</code> die SQL-Ausführungsinformationen von an die Optimiererinformationen. Das heißt, <code>MySQL</code> erklärt, wie die Anweisung verarbeitet wird, einschließlich der Art und Weise, wie die Tabellen verknüpft werden und in welcher Reihenfolge. <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>Ladereihenfolge der Tabellen</li>
<li>Abfragetypen von <code>sql</code>
</li>
<li>Welche Indizes dürfen verwendet werden und welche Indizes werden tatsächlich verwendet</li>
<li> li></li>
<li>Referenzbeziehungen zwischen Tabellen</li>
<li>Wie viele Zeilen in einer Tabelle werden vom Optimierer abgefragt<br>…..</li>
</ul>🎜🎜Erklären Es gibt Welche Informationen🎜🎜<code>Explain</code> Ausführungsplan enthält die folgenden Feldinformationen: <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>Zeilen</code>, <code>gefiltert</code>, <code>Extra</code>12 Felder. 🎜🎜🎜🎜Detaillierte Erläuterung des Ausführungsplans🎜<h3>🎜🎜1. id</h3>🎜<code>id: </code>: Gibt die Reihenfolge an, in der ausgewählte Klauseln oder Operationstabellen in der Abfrage ausgeführt werden. <strong><code je gr der wert von>id</code> ist, desto höher ist die Priorität und wird zuerst ausgeführt</strong>. <code>id</code> wird im Allgemeinen drei Situationen haben: 🎜<h5>🎜🎜1 <code>id</code> ist dasselbe</h5>🎜Siehe die <code>id</code> von drei Datensätze Sie sind alle gleich. Es versteht sich, dass diese drei Tabellen eine Gruppe mit derselben Priorität sind. Die spezifische Reihenfolge wird vom Optimierer bestimmt. 🎜<h5>🎜🎜2. <code>id</code> ist anders</h5>🎜Wenn es eine Unterabfrage in unserem <code>SQL</code> gibt, dann die Seriennummer von <code>id code> wird immer höher sein. Je größer der <code>id</code>-Wert ist, desto höher ist die Priorität und desto früher wird er ausgeführt. Wenn die drei Tabellen nacheinander verschachtelt werden, wird festgestellt, dass die innerste Unterabfrage <code>id</code> die größte ist und zuerst ausgeführt wird. 🎜<h5>🎜🎜3. Die beiden oben genannten existieren gleichzeitig</h5>🎜Ändern Sie den obigen <code>SQL</code> leicht, fügen Sie eine Unterabfrage hinzu und suchen Sie die beiden oben genannten <code>id code> existieren gleichzeitig. Die gleiche <code>id</code> wird in eine Gruppe unterteilt, sodass es drei Gruppen gibt, die nacheinander von oben nach unten ausgeführt werden, je größer der <code>id</code>-Wert verschiedener Gruppen ist , desto höher die Priorität und desto höher die Priorität. 🎜<h3>🎜🎜2. select_type</h3>🎜<code>select_type</code>: Gibt den Typ der <code>select</code>-Abfrage an, die hauptsächlich zur Unterscheidung verschiedener komplexer Abfragen verwendet wird, wie zum Beispiel: Normale Abfrage</code>, <code>Union-Abfrage</code>, <code>Unterabfrage</code> usw. 🎜<h5>🎜🎜1. SIMPLE</h5>🎜<code>SIMPLE</code>: Stellt die einfachste Select-Abfrageanweisung dar, d. h. die Abfrage enthält keine Unterabfragen oder <code>union</code>-Schnittpunkte. Operationen wie Vereinigungs- und Differenzmengen. 🎜<h5>🎜🎜2, PRIMARY</h5>🎜<code>PRIMARY</code>: Wenn die Abfrageanweisung komplexe Unterteile enthält, wird die äußerste Abfrage als <code>PRIMARY</code> markiert. 🎜<h5>🎜🎜3. SUBQUERY</h5>🎜<code>SUBQUERY</code>: Wenn die Liste <code>select</code> oder <code>where</code> eine Unterabfrage enthält, wird die Unterabfrage The Die Abfrage ist markiert: <code>SUBQUERY</code>. 🎜<h5>🎜🎜4, DERIVED</h5>🎜<code>DERIVED</code>: Stellt die Auswahl der Unterabfrage dar, die in der <code>from</code>-Klausel in unserem <code>from</code> enthalten ist. code>In der Liste enthaltene Unterabfragen werden als <code>abgeleitet</code> markiert. 🎜<h5>🎜🎜5, UNION</h5>🎜<code>UNION</code>: Wenn auf <code>union</code> eine <code>select</code>-Anweisung folgt, wird diese markiert ist <code>union</code>; wenn <code>union</code> in einer Unterabfrage der <code>from</code>-Klausel enthalten ist, wird die äußere <code>select</code> als markiert <code>abgeleitet</code>. 🎜<h5>🎜🎜6, UNION-ERGEBNIS</h5>🎜<code>UNION-ERGEBNIS</code>: Stellt das Lesen von Daten aus der temporären Tabelle von <code>union</code> und <code>table dar <code><union1,4></code> der Code>-Spalte gibt an, dass die Ergebnisse der ersten und vierten <code>select</code>-Operation zum Ausführen der <code>union</code>-Operation verwendet werden. 🎜<h3>🎜🎜3. Tabelle</h3>🎜Der abgefragte Tabellenname ist nicht unbedingt eine echte Tabelle. Es gibt einen Alias, um den Alias anzuzeigen, oder es kann eine temporäre Tabelle sein, wie der obige <code>DERIVED </code> , <code><union1,4></code> usw. 🎜<h3>
<span class="header-link octicon octicon-link"></span>4. Partitionen</h3>
<p>Die bei der Abfrage übereinstimmenden Partitionsinformationen sind <code>NULL</code>. Bei der Abfrage einer partitionierten Tabelle zeigt <code>partitions</code> die Partition an Tabelle. Hit-Partitionsstatus. <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. Typ🎜🎜<code>type</code>: Welcher Typ wird in der Abfrage verwendet? Die folgende Leistung reicht von gut bis schlecht In der Reihenfolge: <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>🎜<h5>🎜🎜1. system</h5>🎜<code>system</code>: Wenn die Tabelle nur eine Zeile mit Datensätzen (Systemtabelle) hat, wird die Die Datenmenge ist sehr gering, oft sind keine Festplatten-E/A erforderlich und die Geschwindigkeit ist sehr hoch. 🎜<h5>🎜🎜2, const</h5>🎜<code>const</code>: Zeigt an, dass der <code>Primärschlüssel</code>-Primärschlüssel oder der <code>unique</code> eindeutige Index getroffen wird während der Abfrage, oder Der verkettete Teil ist ein konstanter (<code>const</code>) Wert. Diese Art des Scannens ist äußerst effizient, liefert eine kleine Datenmenge und ist sehr schnell. 🎜<h5>🎜🎜3, eq_ref</h5>🎜<code>eq_ref</code>: Drücken Sie während der Abfrage den Index des Primärschlüssels <code>primary key</code> oder <code>unique key</code>, <code>type</code> ist <code>eq_ref</code>. 🎜<h5>🎜🎜4, ref</h5>🎜<code>ref</code>: Im Gegensatz zu <code>eq_ref</code> bedeutet <code>ref</code> die Verwendung eines nicht eindeutigen Index. Dadurch wurden viele übereinstimmende Zeilen gefunden. 🎜<h5>🎜🎜5, ref_or_null</h5>🎜<code>ref_or_null</code>: Dieser Verbindungstyp ähnelt ref, der Unterschied besteht darin, dass <code>MySQL</code> zusätzlich nach <code> sucht NULL-Wertzeile. 🎜<h5>🎜🎜6, index_merge</h5>🎜<code>index_merge</code>: Die Methode zur Optimierung der Indexzusammenführung wird verwendet und die Abfrage verwendet mehr als zwei Indizes. 🎜<h5>🎜🎜7, unique_subquery</h5>🎜<code>unique_subquery</code>: Ersetzen Sie die folgende <code>IN</code>-Unterabfrage, und die Unterabfrage gibt einen eindeutigen Satz zurück. 🎜rrreee<h5>🎜🎜8, index_subquery</h5>🎜<code>index_subquery</code>: Anders als <code>unique_subquery</code> wird es für nicht eindeutige Indizes verwendet und kann doppelte Werte zurückgeben. 🎜rrreee<h5>🎜🎜9, Bereich</h5>🎜<code>Bereich</code>: Zeilen mithilfe des Index auswählen und nur Zeilen innerhalb des angegebenen Bereichs abrufen. Vereinfacht ausgedrückt geht es darum, Daten innerhalb eines bestimmten Bereichs für ein indiziertes Feld abzurufen. Verwenden Sie <code>bettween...and</code>, <code><</code>, <code>></code>, <code>< in der <code>where</code>-Anweisung =</code>, <code>in</code> und andere bedingte Abfragen <code>type</code> sind alle <code>range</code>. 🎜<h6>🎜🎜Nur der Bereichssuch-<code>Typ</code> für das indizierte Feld ist <code>Bereich</code>. </h6>
<h5>🎜🎜10, index</h5>🎜<code>index</code>: <code>Index</code> und <code>ALL</code> lesen tatsächlich die gesamte Tabelle Der Unterschied besteht darin, dass <code>index</code> zum Lesen den Indexbaum durchläuft, während <code>ALL</code> von der Festplatte liest. 🎜<h5>🎜🎜11, ALL</h5>🎜<code>ALL</code>: Die gesamte Tabelle wird durchsucht, um passende Zeilen zu finden, mit der schlechtesten Leistung. 🎜🎜🎜🎜6. Mögliche_Schlüssel🎜🎜<code>mögliche_Schlüssel</code>: Gibt an, welche Indizes in <code>MySQL</code> es uns ermöglichen, die gewünschten Datensätze in der Tabelle zu finden, wenn ein Index vorhanden ist In einem bestimmten Feld wird der Index aufgelistet, <strong>dieser Index muss jedoch nicht unbedingt der Index sein, der bei der Abfrage der Daten verwendet wird</strong>. Einzelheiten entnehmen Sie bitte dem obigen Beispiel. 🎜🎜🎜🎜7. Schlüssel🎜🎜<code>key</code>: Im Gegensatz zu <code>possible_keys</code> ist der Schlüssel der tatsächlich in der Abfrage verwendete Index <code>NULL </code>. Einzelheiten entnehmen Sie bitte dem obigen Beispiel. 🎜<blockquote>🎜Wenn <code>type</code> <code>index_merge</code> ist, werden möglicherweise mehrere Indizes angezeigt. 🎜</blockquote>🎜🎜🎜8. key_len🎜🎜<code>key_len</code>: Gibt die in der Abfrage verwendete Indexlänge (Anzahl der Bytes) an. Je kürzer die Länge, desto besser. 🎜<ul>
<li>Bei einem einspaltigen Index muss die gesamte Indexlänge berücksichtigt werden. </li>
<li>Bei einem mehrspaltigen Index können nicht alle Spalten verwendet werden Die Abfrage muss berechnet werden. </li>
</ul>
<blockquote>🎜Hinweis: <code>key_len</code> berechnet nur die Indexlänge, die in der Bedingung <code>where</code> verwendet wird, und zwar auch dann, wenn der Index zum Sortieren und verwendet wird Gruppierung, Es wird nicht in <code>key_len</code> berechnet. 🎜</blockquote>
<h3>
<span class="header-link octicon octicon-link"></span>9. ref</h3>
<p><code>ref</code>: Übliche sind: <code>const</code>, <code>func</code>, <code>null</code>, Felder Name. <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>Bei Verwendung einer konstanten äquivalenten Abfrage wird <code>const</code> angezeigt. </li>
<li>Bei der Ausführung einer zugehörigen Abfrage wird das <code>zugehörige Feld</code> des entsprechenden angezeigt ></li>
<li>Wenn die Abfragebedingung <code>expression</code>, <code>function</code> verwendet oder die Bedingungsspalte einer internen impliziten Konvertierung unterzogen wird, wird sie möglicherweise angezeigt als <code>func</code> code></li>
<li>Andere Situationen <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 rows</p>
<h2><code>rowsCode>: Statistische Tabelleninformationen und Indexnutzung, Schätzung der Anzahl der Zeilen, die gelesen werden müssen, um die benötigten Datensätze zu finden. <span class="header-link octicon octicon-link"></span>Dies sind wichtige Daten zur Bewertung der Leistung von <code>SQL</code>. Die Anzahl der Zeilen, die <code>mysql</code> scannen muss, ist eine sehr intuitive Anzeige der Leistung von <code>SQL </code>. Schlecht, im Allgemeinen gilt: Je kleiner der <code>rows</code>-Wert, desto besser. </code></h2>
<p></p>
<p>11. gefiltert</p>
<p><code>gefiltert</code>Dies ist ein Prozentwert, der den Prozentsatz der Anzahl der Datensätze in der Tabelle angibt, die die Bedingungen erfüllen. Vereinfacht ausgedrückt stellt dieses Feld den Anteil der verbleibenden Datensätze dar, die die Bedingungen erfüllen, nachdem die von der Speicher-Engine zurückgegebenen Daten gefiltert wurden. </p>
<p>Wenn Sie vor der <code>MySQL.5.7</code>-Version <code>gefiltert</code> anzeigen möchten, müssen Sie den Befehl <code>explain advanced</code> verwenden. Nach <code>MySQL.5.7</code> zeigt <code>explain</code> standardmäßig direkt die Informationen von <code>Partitionen</code> und <code>gefiltert</code> an. </p>🎜🎜🎜Zwölf, Extra🎜🎜<code>Extra</code>: Informationen, die nicht für die Anzeige in anderen Spalten geeignet sind, viele zusätzliche Informationen in <code>Explain</code> werden in <code> angezeigt Extra wird angezeigt. 🎜<h5>🎜🎜1. Index verwenden</h5>🎜<code>Index verwenden</code>: Wir verwenden den abdeckenden Index in der entsprechenden <code>select</code>-Operation Die Spalte wird durch den Index abgedeckt und die Abfragegeschwindigkeit ist bei Verwendung des abdeckenden Index sehr hoch, was ein idealer Zustand bei der <code>SQL</code>-Optimierung ist. 🎜🎜Was ist ein abdeckender Index?🎜🎜Ein Teil von <code>SQL</code> kann nur über den Index zurückgegeben werden. Die Daten, die wir abfragen müssen (ein oder mehrere Felder), müssen nicht den sekundären Index durchlaufen . Fragen Sie nach dem Primärschlüssel die gesamte Datenzeile über den Primärschlüssel ab (<code>select *</code>). 🎜🎜<strong>Hinweis</strong>: Wenn wir einen abdeckenden Index verwenden möchten, entfernen wir die erforderlichen Felder nur, wenn <code>select</code>, nicht <code>select *</code> und das Feld wird indiziert erstellt. 🎜<h5>🎜🎜2. Verwendung von where</h5>🎜<code>Verwendung von where</code>: Während der Abfrage wird kein verfügbarer Index gefunden und die erforderlichen Daten werden durch bedingte Filterung <code>where</code> abgerufen Es ist jedoch zu beachten, dass nicht bei allen Abfragen mit <code>where</code>-Anweisungen <code>Using where</code> angezeigt wird. 🎜<h5>🎜🎜3. Temporär verwenden</h5>🎜<code>Temporär verwenden</code>: Gibt an, dass die Abfrageergebnisse in einer temporären Tabelle gespeichert werden müssen, die im Allgemeinen beim Sortieren oder Gruppieren von Abfragen verwendet wird. 🎜<h5>🎜🎜4. Filesort verwenden</h5>🎜<code>Filesort verwenden</code>: Zeigt an, dass der Sortiervorgang nicht mit dem Index, also dem Feld von <code>ORDER BY, abgeschlossen werden kann. code> hat keinen Index. Normalerweise muss ein solches SQL optimiert werden. 🎜🎜Wenn das Feld <code>ORDER BY</code> einen Index hat, wird ein abdeckender Index verwendet, was viel schneller als die Ausführung ist. 🎜<h5>🎜🎜5. Join-Puffer verwenden</h5>🎜<code>Join-Puffer verwenden</code>: Wenn wir gemeinsame Tabellen abfragen und die Join-Bedingungen der Tabelle keine Indizes verwenden, benötigen wir einen Join-Puffer Bereich zum Speichern von Zwischenergebnissen. 🎜<h5>🎜🎜6. Unmögliches Where</h5>🎜<code>Unmögliches Where</code>: Das bedeutet, dass wir eine falsche <code>where</code>-Anweisung verwenden, was dazu führt, dass keine Zeilen die Bedingungen erfüllen . 🎜<h5>🎜🎜7. Keine Tabellen verwendet</h5>🎜<code>Keine Tabellen verwendet</code>: Es gibt keine <code>FROM</code>-Klausel in unserer Abfrageanweisung, oder es gibt <code> FROM DUAL</code>-Klausel. 🎜🎜 Die Spalte <code>Extra</code> enthält viele Informationen, daher werde ich sie hier nicht alle auflisten. Weitere Informationen finden Sie in der offiziellen Dokumentation zu <code>MySQL</code>: https://. dev.mysql.com/doc /ref…🎜🎜🎜🎜🎜🎜🎜 Zusammenfassung🎜🎜Schlüsselspalten: 🎜🎜possible_keys: Die Namen von Indizes, die möglicherweise verfügbar sind. Der Indexname ist hier der Index-Spitzname, der bei der Indexerstellung angegeben wurde; wenn der Index keinen Spitznamen hat, wird standardmäßig der Name der ersten Spalte im Index angezeigt (in diesem Beispiel ist es „Vorname“). Die Bedeutung von Standardindexnamen ist oft nicht offensichtlich. 🎜🎜key: Zeigt den Namen des Index an, der tatsächlich von MySQL verwendet wird. Wenn es leer (oder NULL) ist, verwendet MySQL den Index nicht. 🎜🎜key_len: Die Länge des verwendeten Teils des Index in Bytes🎜<p>ref: Ob die Liste (nach Schlüssel) <br> nach einer Konstante (const) oder einem Feld einer bestimmten Tabelle (wenn es sich um einen Join handelt) gefiltert wird; </p>
<p>rows: was MySQL tun muss, bevor es das Richtige finden kann Ergebnis. Die Anzahl der gescannten Datensätze. Offensichtlich ist die ideale Zahl hier 1. </p>
<p>Empfohlenes Lernen: „<a href="https://www.php.cn/course/list/51.html" target="_blank">MySQL-Video-Tutorial</a>“<br></p></code></code></code></code></code>
Das obige ist der detaillierte Inhalt vonWozu dient MySQL Explain? (Mit ausführlicher Ausführungserklärung). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!