Mysql
 sql >> Database >  >> RDS >> Mysql

Clausola IN che non utilizza l'indice

Vado fuori di testa e dico che è perché stai usando il motore MyISAM.

Funziona perfettamente con INNODB, come si può vedere in questa Risposta mio.

Cercherò di spaventare almeno 1 riferimento onorevole sulla questione.

Qui, Il tipo di join dell'intervallo , chiaramente un focus INNODB in quanto è il motore predefinito. E quando non esplicitamente menzionato nel manuale in alcune gerarchie di documentazione, si presume.

Nota, non c'è nulla di contiguo negli ID nel mio collegamento di esempio. Ciò significa che non concentrarti su type=range nel suo output EXPLAIN. La velocità viene raggiunta tramite l'ottimizzatore (il CBO).

La cardinality nel mio esempio è molto alto (4,3 milioni). I conteggi degli ID target sono relativamente bassi (1000). Viene utilizzato l'indice.

La tua situazione potrebbe essere l'opposto:la tua cardinalità potrebbe essere incredibilmente bassa, come 3, e l'ottimizzatore decide di abbandonare l'uso dell'indice.

Per verificare la cardinality del tuo indice , vedere la pagina del manuale Sintassi SHOW INDEX .

Una semplice chiamata come:

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