Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Klauzula IN nie używa indeksu

Pójdę na kończynę i powiem, że to dlatego, że używasz silnika MyISAM.

Działa doskonale z INNODB, co można zobaczyć w tej Odpowiedź mojego.

Postaram się wywołać co najmniej 1 honorowe referencje w tej sprawie.

Tutaj Typ łączenia zakresu , wyraźnie koncentruje się na INNODB, ponieważ jest to domyślny aparat. A jeśli nie jest to wyraźnie wymienione w podręczniku w jakiejś hierarchii dokumentacji, zakłada się.

Uwaga, w moim przykładowym łączu nie ma nic ciągłego w identyfikatorze. To znaczy, nie koncentruj się na type=range w swoim wyjściu EXPLAIN. Prędkość jest osiągana za pomocą Optymalizatora (CBO).

cardinality w moim przykładzie jest bardzo wysoka (4,3 mln). Liczba identyfikatorów docelowych jest stosunkowo niska (1000). Używany jest indeks.

Twoja sytuacja może być odwrotna:Twoja kardynalność może być niewiarygodnie niska, np. 3, a optymalizator zdecyduje się zrezygnować z używania indeksu.

Aby sprawdzić indeks cardinality , zobacz stronę podręcznika POKAŻ składnię INDEKSU .

Proste wywołanie, takie jak:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. APPARENT DEADLOCK Tworzenie wątków awaryjnych dla nieprzypisanych zadań oczekujących

  2. Różnica między LIKE i =w MYSQL?

  3. Wydajne przechowywanie danych szeregów czasowych:mySQL czy pliki płaskie? Wiele tabel (lub plików) lub zapytań z warunkiem WHERE?

  4. INET_ATON() i INET_NTOA() w PHP?

  5. Jak wyświetlić parametry procedury składowanej mysql?