Unabhängig vom Einzelspaltenindex oder gemeinsamen Index entspricht ein Index einem unabhängigen B+-Indexbaum Die Indexbaumknoten enthalten nur:
Feldwerte im Index
Primärschlüsselwert
Auch wenn die erforderlichen Daten gemäß den Bedingungen gemäß dem Indexbaum gefunden werden, handelt es sich nur um die Werte mehrerer Felder und Primärschlüsselwerte im Index. Wenn Sie einen select *
ausführen, wird dies weiterhin der Fall sein. Um andere Felder abzurufen, müssen Sie zur Tabelle zurückkehren und im Clustered-Index nach dem Blattknoten des Clusters suchen index ist die Datenseite. Nur wenn Sie die Datenseite finden, können Sie alle Feldwerte einer Datenzeile auslesen.
Ähnlich wie bei 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
-Ausführungs-Engine, dass dies dem Scannen aller Daten des gemeinsamen Index und des Clustered-Index entspricht, wenn Sie sagen: 🎜rrreee🎜, daher ist es besser, dies nicht zu tun Bei gemeinsamen Indizes kann die gesamte Tabelle direkt gescannt werden, sodass nur ein Primärschlüsselindex gescannt wird. 🎜🎜🎜Aber wenn es so aussieht: 🎜🎜rrreee🎜Dann weiß die Ausführungsmaschine, dass Sie zuerst den Indexbaum des gemeinsamen Index scannen und 10 Datenelemente erhalten und dann die 10 Datenelemente 10 Mal im durchsuchen Clustered-Index, dann wird weiterhin der gemeinsame Index verwendet. 🎜🎜2 Covering-Index🎜🎜Covered-Index ist kein Index, sondern eine Methode zur Abfrage basierend auf dem Index. Das heißt, für Dinge wie 🎜rrreee🎜, die nur die Werte einiger Felder im gemeinsamen Index benötigen, Dann müssen Sie nur den Index des gemeinsamen Indexbaums durchsuchen und müssen nicht zur Tabelle zurückkehren, um andere Felder zu finden. select *
. Gehen Sie am besten direkt zum abdeckenden Index. limit
und where
verwenden, um die Anzahl der Tabellenrückgaben so weit wie möglich zu begrenzen und eine kleine Filterung vorzunehmen Anzahl der Daten aus dem gemeinsamen Index und dann zur Tabelle zurückkehren, damit die Leistung besser ist. 🎜Das obige ist der detaillierte Inhalt vonWie hoch ist der Leistungsverbrauch der MySQL-Tabellenrückgabe?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!