Heim  >  Artikel  >  Datenbank  >  Welche Rolle spielt MySQL?

Welche Rolle spielt MySQL?

coldplay.xixi
coldplay.xixiOriginal
2020-06-29 16:10:142752Durchsuche

Die Funktion von MySQL Explain besteht darin, zu simulieren, wie der MySQL-Optimierer SQL-Abfrageanweisungen ausführt, um zu wissen, wie MySQL die SQL-Anweisungen des Benutzers verarbeitet, die Effizienz beim Datenabruf zu verbessern und die E/A-Kosten der Datenbank zu senken.

Welche Rolle spielt MySQL?

Die Funktion von MySQL Explain ist:

Simulieren Sie, wie der MySQL-Optimierer SQL-Abfrageanweisungen ausführt, um wissen, wie MySQL Ihre SQL-Anweisungen verarbeitet. Analysieren Sie die Leistungsengpässe Ihrer Abfrageanweisungen oder Tabellenstrukturen.

mysql> explain select * from tb_user;
+----+-------------+---------+------+---------------+------+---------+------+------+-------+
| id | select_type | table   | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+---------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | tb_user | ALL  | NULL          | NULL | NULL    | NULL |    1 | NULL  |
+----+-------------+---------+------+---------------+------+---------+------+------+-------+

(1) ID-Spalte:

(1)、id 相同执行顺序由上到下
mysql> explain  
    -> SELECT*FROM tb_order tb1
    -> LEFT JOIN tb_product tb2 ON tb1.tb_product_id = tb2.id
    -> LEFT JOIN tb_user tb3 ON tb1.tb_user_id = tb3.id;
+----+-------------+-------+--------+---------------+---------+---------+---------------------------+------+-------+
| id | select_type | table | type   | possible_keys | key     | key_len | ref                       | rows | Extra |
+----+-------------+-------+--------+---------------+---------+---------+---------------------------+------+-------+
|  1 | SIMPLE      | tb1   | ALL    | NULL          | NULL    | NULL    | NULL                      |    1 | NULL  |
|  1 | SIMPLE      | tb2   | eq_ref | PRIMARY       | PRIMARY | 4       | product.tb1.tb_product_id |    1 | NULL  |
|  1 | SIMPLE      | tb3   | eq_ref | PRIMARY       | PRIMARY | 4       | product.tb1.tb_user_id    |    1 | NULL  |
+----+-------------+-------+--------+---------------+---------+---------+---------------------------+------+-------+
(2)、如果是子查询,id序号会自增,id值越大优先级就越高,越先被执行。
mysql> EXPLAIN
    -> select * from tb_product tb1 where tb1.id = (select tb_product_id from  tb_order tb2 where id = tb2.id =1);
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref   | rows | Extra       |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
|  1 | PRIMARY     | tb1   | const | PRIMARY       | PRIMARY | 4       | const |    1 | NULL        |
|  2 | SUBQUERY    | tb2   | ALL   | NULL          | NULL    | NULL    | NULL  |    1 | Using where |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
(3)、id 相同与不同,同时存在
mysql> EXPLAIN 
    -> select * from(select * from tb_order tb1 where tb1.id =1) s1,tb_user tb2 where s1.tb_user_id = tb2.id;
+----+-------------+------------+--------+---------------+---------+---------+-------+------+-------+
| id | select_type | table      | type   | possible_keys | key     | key_len | ref   | rows | Extra |
+----+-------------+------------+--------+---------------+---------+---------+-------+------+-------+
|  1 | PRIMARY     | <derived2> | system | NULL          | NULL    | NULL    | NULL  |    1 | NULL  |
|  1 | PRIMARY     | tb2        | const  | PRIMARY       | PRIMARY | 4       | const |    1 | NULL  |
|  2 | DERIVED     | tb1        | const  | PRIMARY       | PRIMARY | 4       | const |    1 | NULL  |
+----+-------------+------------+--------+---------------+---------+---------+-------+------+-------+
derived2:衍生表   2表示衍生的是id=2的表 tb1

Verwandte Lernempfehlungen: MySQL-Video-Tutorial

(2) Spalte „select_type“: Operationstyp des Datenlesevorgangs

 1. EINFACH: Einfache Auswahlabfrage, SQL enthält keine Unterabfragen oder UNION.

2. PRIMÄR: Die Abfrage enthält einen komplexen Unterabfrageteil und die äußerste Abfrage ist als PRIMÄR markiert.

3. UNTERABFRAGE: Die Unterabfrage

ist in der Auswahl- oder WHERE-Liste 4. DERIVED: Die in der FROM-Liste enthaltenen Unterabfragen werden als DERIVED markiert (die Ableitungstabelle führt diese Unterabfragen rekursiv aus und fügt die Ergebnismenge in die Nullzeittabelle ein).

5. UNION: Wenn das zweite SELECT nach UNION erscheint, wird es als UNION markiert; wenn UNION in der Unterabfrage der FROM-Klausel enthalten ist, wird das äußere SELECT als DERIVED markiert

 6. UNION-ERGEBNIS: Wählen Sie das aus der UNION-Tabelle erhaltene Ergebnis aus

(3) Tabellenspalte: Um welche Tabelle geht es in der Datenzeile

( 4) Typspalte: Zugriffstyp vom besten zum schlechtesten System > eq_ref > ref > ALLE : Die Tabelle hat nur einen Datensatz (entspricht der Systemtabelle). Dies ist ein Sonderfall des Typs const und kommt im normalen Geschäftsbetrieb nicht vor. 2,

: Daten einmal über den Index finden. Dieser Typ wird hauptsächlich zum Vergleichen von Primärschlüsseln oder eindeutigen Indizes verwendet. Da er nur mit einer Datenzeile übereinstimmt, ist er sehr schnell nach der WHERE-Anweisung platziert wird, kann MySQL die Abfrage in eine Konstante umwandeln.

system3.

: Eindeutiger Indexscan Für jeden Indexschlüssel stimmt nur ein Datensatz mit ihm überein. Kommt häufig bei Primärschlüssel- oder eindeutigen Index-Scans vor.

const4.

: Nicht eindeutiger Index-Scan, gibt alle Zeilen zurück, die einem einzelnen Wert entsprechen. Es handelt sich im Wesentlichen um einen Indexzugriff. Es werden möglicherweise mehrere Daten zurückgegeben gefunden werden, die die Bedingungen erfüllen, es handelt sich also um eine Mischung aus Suchen und Scannen.

eq_ref Ausführliche Erklärung: Dieser Typ bedeutet, dass MySQL schnell einen qualifizierten Index basierend auf einem bestimmten Algorithmus findet, anstatt alle Daten im Index einzeln zu scannen und zu beurteilen, was Sie normalerweise als „Verstehen der Verwendung“ bezeichnen Indexabfragen rufen Daten schneller ab. Um diese Art der Suche zu erreichen, sind Indizes erforderlich. Um diesen schnellen Suchalgorithmus zu implementieren, muss der Index einer bestimmten Datenstruktur entsprechen. Um es einfach auszudrücken: Die Daten im Indexfeld müssen vorhanden sein, um diese Art der Suche zu erreichen und den Index zu verwenden.

5, ref: Rufen Sie nur Zeilen in einem bestimmten Bereich ab und verwenden Sie einen Index, um Zeilen auszuwählen. In der Schlüsselspalte wird angezeigt, welcher Index verwendet wurde. Im Allgemeinen erscheinen Abfragen wie between, 95ec6993dc754240360e28e0de8de30a und in in Ihrer WHERE-Anweisung. Diese Art der Suche nach vorgegebenen Bereichen ist besser als die vollständige Tabellensuche. Weil es nur an einem bestimmten Punkt im Index beginnen und an einem anderen Punkt enden muss, ohne den gesamten Index zu scannen.

6.

: Der vollständige Index-Scan durchläuft den Indexbaum (Index: Dieser Typ bedeutet, dass MySQL den gesamten Index scannt. Um diesen Indextyp zu verwenden, scannen Sie den Index und Es gibt keine besonderen Anforderungen Solange es sich um einen Index oder einen Teil eines zusammengesetzten Index handelt, kann MySQL den Indextyp scannen. Der Nachteil besteht jedoch darin, dass MySQL nicht die einzelnen Daten im Index durchsucht Daten, bis ein Index gefunden wird, der die Beurteilungsbedingungen erfüllt).

range7.

: Vollständiger Tabellenscan. Optimieren Sie so viele Daten wie möglich von der Festplatte.

index

(5) Spalte „mögliche Schlüssel“

: Zeigt einen oder mehrere Indizes an, die auf diese Tabelle angewendet werden können. Wenn ein Index für die an der Abfrage beteiligten Felder vorhanden ist, wird der Index aufgelistet, aber möglicherweise nicht tatsächlich von der Abfrage verwendet. ALL

(6) Schlüsselspalte: Der tatsächlich verwendete Index. Bei NULL wird kein Index verwendet. Wenn in der Abfrage ein abdeckender Index verwendet wird, erscheint der Index nur in der Schlüsselliste. Abdeckungsindex: Die Felder nach der Auswahl stimmen mit der Anzahl der von uns indizierten Felder überein.

(7) Spalte ken_len: stellt die Anzahl der im Index verwendeten Bytes dar. Diese Spalte kann zur Berechnung der in der Abfrage verwendeten Indexlänge verwendet werden. Je kürzer die Länge, desto besser, ohne dass die Genauigkeit verloren geht. Der von key_len angezeigte Wert ist die maximal mögliche Länge des Indexfelds, nicht die tatsächlich verwendete Länge. Das heißt, key_len wird basierend auf der Tabellendefinition berechnet und nicht aus der Tabelle abgerufen.

(八)ref列:显示索引的哪一列被使用了,如果可能的话,是一个常数。哪些列或常量被用于查找索引列上的值。

(九)rows列(每张表有多少行被优化器查询):根据表统计信息及索引选用的情况,大致估算找到所需记录需要读取的行数。

(十)Extra列:扩展属性,但是很重要的信息。

1、 Using filesort(文件排序):mysql无法按照表内既定的索引顺序进行读取。
 mysql> explain select order_number from tb_order order by order_money;
+----+-------------+----------+------+---------------+------+---------+------+------+----------------+
| id | select_type | table    | type | possible_keys | key  | key_len | ref  | rows | Extra          |
+----+-------------+----------+------+---------------+------+---------+------+------+----------------+
|  1 | SIMPLE      | tb_order | ALL  | NULL          | NULL | NULL    | NULL |    1 | Using filesort |
+----+-------------+----------+------+---------------+------+---------+------+------+----------------+
1 row in set (0.00 sec)
说明:order_number是表内的一个唯一索引列,但是order by 没有使用该索引列排序,所以mysql使用不得不另起一列进行排序。
2、Using temporary:Mysql使用了临时表保存中间结果,常见于排序order by 和分组查询 group by。
mysql> explain select order_number from tb_order group by order_money;
+----+-------------+----------+------+---------------+------+---------+------+------+---------------------------------+
| id | select_type | table    | type | possible_keys | key  | key_len | ref  | rows | Extra                           |
+----+-------------+----------+------+---------------+------+---------+------+------+---------------------------------+
|  1 | SIMPLE      | tb_order | ALL  | NULL          | NULL | NULL    | NULL |    1 | Using temporary; Using filesort |
+----+-------------+----------+------+---------------+------+---------+------+------+---------------------------------+
1 row in set (0.00 sec)
3、Using index 表示相应的select 操作使用了覆盖索引,避免访问了表的数据行,效率不错。
如果同时出现Using where ,表明索引被用来执行索引键值的查找。
如果没有同时出现using where 表明索引用来读取数据而非执行查找动作。
mysql> explain select order_number from tb_order group by order_number;
+----+-------------+----------+-------+--------------------+--------------------+---------+------+------+-------------+
| id | select_type | table    | type  | possible_keys      | key                | key_len | ref  | rows | Extra       |
+----+-------------+----------+-------+--------------------+--------------------+---------+------+------+-------------+
|  1 | SIMPLE      | tb_order | index | index_order_number | index_order_number | 99      | NULL |    1 | Using index |
+----+-------------+----------+-------+--------------------+--------------------+---------+------+------+-------------+
1 row in set (0.00 sec)
4、Using where 查找
5、Using join buffer :表示当前sql使用了连接缓存。
6、impossible where :where 字句 总是false ,mysql 无法获取数据行。
7、select tables optimized away:
8、distinct:

Das obige ist der detaillierte Inhalt vonWelche Rolle spielt MySQL?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

In Verbindung stehende Artikel

Mehr sehen