Maison  >  Article  >  base de données  >  Le rôle d'EXPLAIN dans Mysql

Le rôle d'EXPLAIN dans Mysql

一个新手
一个新手original
2017-10-17 10:04:301603parcourir

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 : faciliter 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 le 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éliorez l'efficacité de la récupération des données et réduisez les coûts d'E/S de la base de données
B. Triez les données via les colonnes d'index, réduisant ainsi les coûts de tri des données et la consommation du processeur.
Inconvénients : A. L'index est également une table. La table enregistre la clé primaire et les champs d'index et pointe vers les enregistrements de la table d'entité, donc l'index prend également de la place.
B. Lors de l'exécution des opérations INSERT, UPDATE et DELETE sur la table, MYSQL mettra non seulement à jour les données, mais enregistrera également les informations correspondantes sur les champs de la colonne d'index ajoutées 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 ne pas créer plus de 5 index pour une table

Syntaxe :

Créer 1. CRÉER [UNIQUE] INDEX indexName ON myTable (columnName(length));
2. ALTER myTable Ajouter [UNIQUE] INDEX [indexName] ON (columnName(length));
Supprimer : DROP INDEX [indexName] ON myTable;
Vue : SHOW INDEX FROM table_nameG;

2. Le rôle d'EXPLAIN

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 identifiant :


(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

(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 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 le résultat 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 > ref > index >

  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 |
+----+-------------+----------+------+---------------+------+---------+------+------+----------------+
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 |
+----+-------------+----------+------+---------------+------+---------+------+------+---------------------------------+
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 |
+----+-------------+----------+-------+--------------------+--------------------+---------+------+------+-------------+
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:

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