Maison  >  Article  >  base de données  >  Explication détaillée du rôle d'explication dans Mysql

Explication détaillée du rôle d'explication dans Mysql

小云云
小云云original
2017-12-08 11:23:291507parcourir

Cet article présente principalement le contenu pertinent d'explain dans Mysql, impliquant une certaine connaissance de l'indexation, et a une certaine valeur de référence. Les amis qui en ont besoin peuvent en apprendre davantage.

1. Index MYSQL

Index : Une structure de données qui aide Mysql à obtenir des données efficacement. Utilisé pour améliorer l’efficacité de la recherche, il peut être comparé à un dictionnaire. Il peut être simplement compris comme une structure de données de recherche triée et rapide.

Le rôle de l'index : Facilite l'interrogation et le tri (donc l'ajout d'un index affectera l'instruction Where et l'ordre par instruction de tri).

En plus des données, les bases de données conservent également des structures de données qui satisfont des algorithmes de recherche spécifiques et qui référencent les données d'une manière ou d'une autre. Cela permet d’implémenter des algorithmes de recherche avancés sur ces structures de données. Ces structures de données sont des index.

L'index lui-même est également très volumineux et ne peut pas être entièrement stocké en mémoire, c'est pourquoi l'index est souvent stocké sur disque sous la forme d'un fichier d'index.

L'index auquel nous faisons habituellement référence est généralement un index B-tree, sauf indication contraire. (L'index clusterisé, l'index composé, l'index de préfixe et l'index unique sont tous des index d'arbre B+ par défaut. En plus des index d'arbre B, il existe également des index de hachage.)

Avantages :

A. Améliorer l'efficacité de la récupération des données et réduire le coût des E/S de la base de données
Grâce au tri par appariement des colonnes d'index. les données réduisent les coûts de tri des données et la consommation du processeur.

Inconvénients :

A L'index est également une table, qui stocke la clé primaire et les champs d'index et pointe vers le. enregistrements de la table d'entité, donc l'index prend également de la place.
B. Lors des opérations INSERT, UPDATE et DELETE sur la table, MYSQL mettra non seulement à jour les données, mais enregistrera également les informations correspondantes des champs de colonne d'index ajoutés au fichier d'index à chaque fois qu'il est mis à jour.

Dans l'environnement de production actuel, nous devons analyser étape par étape, optimiser et établir l'index optimal, et optimiser nos conditions de requête.

Classification des index :

1. Index à valeur unique Un index ne contient qu'un seul champ, et une table peut avoir plusieurs index à une seule colonne.
2. Index unique La valeur de la colonne d'index doit être unique, mais les valeurs nulles sont autorisées.
3. Index composite : Un index contient plusieurs colonnes

Il est recommandé de créer moins de 5 index pour une table

Syntaxe :

1. CRÉER [UNIQUE] INDEX nom_index SUR maTable (nom_colonne(longueur));
2. ALTER maTable Ajouter [UNIQUE] INDEX [nom_index] SUR (nom_colonne(longueur));

Supprimer : DROP INDEX [indexName] ON myTable;

Afficher : SHOW INDEX FROM table_nameG;

2.

EXPLIQUER : Simulez la façon dont l'optimiseur Mysql exécute les instructions de requête SQL, afin que vous puissiez savoir comment Mysql traite vos instructions SQL. Analysez les goulots d'étranglement des performances de vos instructions de requête ou de vos structures de table.

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) colonne d'identifiant :

(1), identifiant même ordre d'exécution de haut en bas bottom Next

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) S'il s'agit d'une sous-requête, le numéro de série de l'identifiant augmentera automatiquement. Plus la valeur de l'identifiant est grande, plus elle est élevée. priorité, et plus tôt il est traité et mis en œuvre.

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) Des identifiants identiques et différents existent en même temps

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 : La table dérivée 2 signifie que la table dérivée tb1 avec id=2

(2) colonne select_type : type d'opération de lecture de données

1. SIMPLE : requête de sélection simple, SQL ne contient pas de sous-requêtes ni d'UNION.
2. PRIMARY : La requête contient une partie de sous-requête complexe et la requête la plus externe est marquée comme PRIMARY
3. SUBQUERY : La sous-requête est incluse dans la liste de sélection ou WHERE
4. DERIVED : Dans FROM The les sous-requêtes contenues dans la liste seront marquées comme DERIVED (table dérivée), et MYSQL exécutera récursivement ces sous-requêtes et placera l'ensemble de résultats dans la table à temps zéro.
5. UNION : Si le deuxième SELECT apparaît après UNION, il sera marqué comme UNION ; si UNION est inclus dans la sous-requête de la clause FROM, le SELECT externe sera marqué comme DERIVED
6. RÉSULTAT DE L'UNION : Sélectionnez pour obtenir les résultats de la table UNION

(3) colonne de table : de quelle table porte la ligne de données

( 4) colonne de type : type d'accès du meilleur au pire système > const > eq_ref > ref >

  1、system:表只有一条记录(等于系统表),这是const类型的特例,平时业务中不会出现。
  2、const:通过索引一次查到数据,该类型主要用于比较primary key 或者unique 索引,因为只匹配一行数据,所以很快;如果将主键置于WHERE语句后面,Mysql就能将该查询转换为一个常量。
  3、eq_ref:唯一索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或者唯一索引扫描。
  4、ref:非唯一索引扫描,返回匹配某个单独值得所有行,本质上是一种索引访问,它返回所有匹配某个单独值的行,就是说它可能会找到多条符合条件的数据,所以他是查找与扫描的混合体。
  5、range:只检索给定范围的行,使用一个索引来选着行。key列显示使用了哪个索引。一般在你的WHERE 语句中出现between 、66f7a98850431fb8c0d9470a35d9d294 、in 等查询,这种给定范围扫描比全表扫描要好。因为他只需要开始于索引的某一点,而结束于另一点,不用扫描全部索引。
  6、index:FUll Index Scan 扫描遍历索引树(扫描全表的索引,从索引中获取数据)。
  7、ALL 全表扫描 从磁盘中获取数据 百万级别的数据ALL类型的数据尽量优化。

(五)possible_keys列:显示可能应用在这张表的索引,一个或者多个。查询涉及到的字段若存在索引,则该索引将被列出,但不一定被查询实际使用。

(六)keys列:实际使用到的索引。如果为NULL,则没有使用索引。查询中如果使用了覆盖索引,则该索引仅出现在key列表中。覆盖索引:select 后的 字段与我们建立索引的字段个数一致。

(七)ken_len列:表示索引中使用的字节数,可通过该列计算查询中使用的索引长度。在不损失精确性的情况下,长度越短越好。key_len 显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出来的。

(八)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:

相关推荐:

MySQL中explain的使用以及性能分析

解析MySQL中EXPLAIN命令

mysql总结之explain_PHP教程

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:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn