Mysql
 sql >> Datenbank >  >> RDS >> Mysql

IN-Klausel verwendet keinen Index

Ich werde auf die Beine gehen und sagen, dass es daran liegt, dass Sie die MyISAM-Engine verwenden.

Es funktioniert einwandfrei mit INNODB, wie in dieser Antwort zu sehen ist von mir.

Ich werde versuchen, mindestens 1 ehrenwerte Referenz zu diesem Thema zu finden.

Hier Der Bereich Join Type , eindeutig ein INNODB-Fokus, da es die Standard-Engine ist. Und wenn es nicht ausdrücklich im Handbuch in irgendeiner Dokumentationshierarchie erwähnt wird, wird davon ausgegangen.

Beachten Sie, dass die IDs in meinem Beispiellink nicht zusammenhängend sind. Konzentrieren Sie sich also nicht auf type=range in seiner EXPLAIN-Ausgabe. Die Geschwindigkeit wird über den Optimizer (den CBO) erreicht.

Die cardinality in meinem Beispiel ist sehr hoch (4,3 Millionen). Die Anzahl der Ziel-IDs ist relativ niedrig (1000). Der Index wird verwendet.

Ihre Situation könnte genau umgekehrt sein:Ihre Kardinalität könnte unglaublich niedrig sein, etwa 3, und der Optimierer beschließt, auf die Verwendung des Index zu verzichten.

Um Ihre Index-cardinality zu überprüfen , siehe Handbuchseite SHOW INDEX Syntax .

Ein einfacher Aufruf wie:

show index from ratings;

+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table   | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| ratings |          0 | PRIMARY  |            1 | id          | A         |     4313544 |     NULL | NULL   |      | BTREE      |         |               |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+