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 valeursde plusieurs champs et valeurs de clé primairedans 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次即可,那就还是会走联合索引。
覆盖索引不是一种索引,只是一种基于索引查询的方式,即针对类似
select xx1,xx2,xx3 from table order by xx1,xx2,xx3
仅需联合索引里的几个字段的值,那就只需扫描联合索引的索引树,无需回表找其它字段,这种查询方式就是覆盖索引。
所以当你使用联合索引时,注意是否可能会导致大量回表到聚簇索引,若回表聚簇索引的次数太多,可能就直接给你做成全表扫描而不走联合索引了。
尽可能还是在SQL里指定你仅需要的字段,而不要暴力select *
,最好直接走覆盖索引。
即使无可避免地要回表,你也尽可能用limit
、 where
rrreee
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. select *
violemment. Il est préférable d'aller directement dans l'index de couverture. 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!