Maison  >  Article  >  base de données  >  Quelle est la consommation de performances du retour de table MySQL ?

Quelle est la consommation de performances du retour de table MySQL ?

王林
王林avant
2023-05-26 19:34:21737parcourir

1 Consommation de performances du retour de table

Indépendamment de l'index à colonne unique ou de l'index conjoint, un index correspond à un arbre d'index B+ indépendant Les nœuds de l'arbre d'index contiennent uniquement :

  • Valeurs de champ dans l'index

  • .
  • Valeur de clé primaire

Même si les données requises sont trouvées selon les conditions selon l'arborescence d'index, ce ne sont que les valeurs​​de plusieurs champs et valeurs de clé primaire​​dans l'index. Si vous faites un select *, alors ce sera toujours le cas. Pour obtenir d'autres champs, vous devez revenir à la table et rechercher dans l'index clusterisé en fonction de la clé primaire Le nœud feuille du cluster. index est la page de données. Ce n'est qu'en trouvant la page de données que vous pouvez lire toutes les valeurs de champ d'une ligne de données.
Très similaire à select *,那就还得其他字段,就需回表,根据主键到聚簇索引里找,聚簇索引的叶节点是数据页,找到数据页才能把一行数据所有字段值读出来。
所以类似

select * from table order by xx1,xx2,xx3

得从联合索引的索引树里按序取出所有数据,接着对每条数据都走一个主键的聚簇索引查找,性能不高。
有时MySQL执行引擎可能认为,你要是类似

select * from table order by xx1,xx2,xx3

相当于得把联合索引和聚簇索引,两个索引的所有数据都扫描一遍,那还不如不走联合索引,直接全表扫描得了,这样就只需扫描一个主键索引。

但若形如:

select * from table order by xx1,xx2,xx3 limit 10

那执行引擎就知道你先扫描联合索引的索引树,拿到10条数据,接着对10条数据在聚簇索引里查找10次即可,那就还是会走联合索引。

2 覆盖索引

覆盖索引不是一种索引,只是一种基于索引查询的方式,即针对类似

select xx1,xx2,xx3 from table order by xx1,xx2,xx3

仅需联合索引里的几个字段的值,那就只需扫描联合索引的索引树,无需回表找其它字段,这种查询方式就是覆盖索引。
所以当你使用联合索引时,注意是否可能会导致大量回表到聚簇索引,若回表聚簇索引的次数太多,可能就直接给你做成全表扫描而不走联合索引了。
尽可能还是在SQL里指定你仅需要的字段,而不要暴力select *,最好直接走覆盖索引。
即使无可避免地要回表,你也尽可能用limitwhererrreee

, vous devez récupérer toutes les données dans l'ordre depuis l'arborescence d'index de l'index conjoint, puis effectuer une recherche d'index clusterisé par clé primaire pour chaque élément de données, ce qui n'est pas très performant.
Parfois, le moteur d'exécution MySQL peut penser que si vous êtes comme 🎜rrreee🎜, cela équivaut à analyser toutes les données de l'index commun et de l'index clusterisé, il vaut donc mieux ne pas partir . Pour les index conjoints, vous pouvez analyser directement la table entière, vous n'avez donc besoin d'analyser qu'un seul index de clé primaire. 🎜🎜🎜Mais si cela ressemble à ceci : 🎜🎜rrreee🎜Alors le moteur d'exécution saura que vous parcourez d'abord l'arborescence d'index de l'index conjoint et obtenez 10 éléments de données, puis recherchez les 10 éléments de données 10 fois dans le index clusterisé, alors utilisera toujours l'index conjoint. 🎜🎜2 Index de couverture🎜🎜L'index couvert n'est pas un index, mais un moyen d'interroger basé sur l'index. Autrement dit, pour des choses comme 🎜rrreee🎜, qui n'a besoin que des valeurs de quelques champs dans l'index commun, il vous suffit alors de parcourir l'index de l'index commun, il n'est pas nécessaire de revenir à la table pour trouver d'autres champs. Cette méthode de requête est un index de couverture.
Ainsi, lorsque vous utilisez un index conjoint, faites attention à ce qu'il puisse entraîner un grand nombre de retours de table vers l'index clusterisé. Si le nombre de fois où la table doit être renvoyée vers l'index clusterisé est trop élevé, vous risquez de l'être. directement analysé la table entière sans utiliser la jointure.
Dans la mesure du possible, précisez uniquement les champs dont vous avez besoin en SQL au lieu de select * violemment. Il est préférable d'aller directement dans l'index de couverture.
Même s'il est inévitable de retourner la table, vous devez utiliser limit et where pour limiter au maximum le nombre de retours de table, et filtrer un petit nombre de données de l'index conjoint, puis revenez au tableau, les performances sont donc meilleures. 🎜

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