Conception et utilisation de l'index des notes d'étude de base de MySQL

Conception et utilisation de l'index

1. Aperçu de l'index

Tous les types de colonnes MySQL peuvent être indexés. L'utilisation d'index sur des colonnes associées est le meilleur moyen d'améliorer les performances des opérations SELECT. Selon le nombre maximum d'index et la longueur d'index maximum de chaque table qui peuvent être définis par le moteur de stockage, chaque moteur de stockage prend en charge au moins 16 index pour chaque table, et la longueur totale d'index est d'au moins 256 octets.

Les tables des moteurs de stockage MyISAM et InnoDB sont toutes des index BTREE créés par défaut . MySQL ne prend actuellement pas en charge les index fonctionnels, mais prend en charge les index de préfixe, c'est-à-dire pour créer un index sur les N premiers caractères du champ d'index. La longueur de l'index de préfixe est liée au moteur de stockage. Pour les tables du moteur de stockage MyISAM, la longueur du préfixe d'index peut atteindre 1 000 octets, tandis que pour les tables du moteur de stockage InnoDB, la longueur du préfixe d'index peut atteindre 767 octets.

MySQL prend également en charge l'indexation de texte intégral, qui peut être utilisée pour la recherche en texte intégral. Mais dans la dernière version actuelle, seul le moteur de stockage MyISAM prend en charge les index FULLTEXT, et il est limité aux colonnes CHAR, VARCHAR et TEXT. Les index sont toujours exécutés sur la colonne entière et les index locaux ne sont pas pris en charge.

Vous pouvez également créer des index pour les types de colonnes spatiales, mais seuls les index de stockage MyISAM prennent en charge les index spatiaux et les champs indexés doivent être non vides.

Par défaut, le moteur de stockage MEMORY utilise l'index HASH, mais il prend également en charge l'index BTREE .

Les index peuvent être créés en même temps que la table est créée, ou de nouveaux index peuvent être ajoutés à tout moment. La syntaxe pour créer un nouvel index est:

CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
[USING index_type]
ON tbl_name(index_col_name,...)

index_col_name:
	col_name[(length)][ASC|DESC]

Vous pouvez également utiliser la syntaxe de ALTER TABLE pour ajouter des index. La syntaxe est similaire à CREATE INDEX. Par exemple, pour créer un index de préfixe de 10 octets pour la table de ville:

mysql> create index cityname on city(city(10));
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

La syntaxe pour la suppression d'index est:

DROP INDEX index_name ON tbl_name
mysql> drop index cityname on city;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

2. Le principe de la conception d'index

  • La colonne d'index à rechercher n'est pas nécessairement la colonne à sélectionner. En d'autres termes, la colonne d'index la plus appropriée est la colonne qui apparaît dans la clause WHERE, ou la colonne dans la clause de jointure, plutôt que la colonne qui apparaît dans la liste de sélection après le mot clé SELECT.
  • Utilisez un index unique. Prenez en compte la distribution des valeurs dans une colonne. Plus la cardinalité de la colonne indexée est élevée, meilleur est l'effet d'index.
  • Utilisez des index courts.
  • Utilisez le préfixe le plus à gauche.
  • Ne sur-indexez pas.
  • Pour les tables du moteur de stockage InnoDB, les enregistrements seront enregistrés dans un certain ordre par défaut. S'il existe des clés primaires clairement définies, elles seront enregistrées dans l'ordre des clés primaires. S'il n'y a pas de clé primaire, mais qu'il existe un index unique, il est stocké dans l'ordre de l'index unique. S'il n'y a ni clé primaire ni index unique, une colonne interne est automatiquement générée dans la table et stockée dans l'ordre de cette colonne.

3. Index BTREE et index HASH

Les tables du moteur de stockage MEMORY peuvent choisir d'utiliser l'index BTREE ou l'index HASH , et les deux types d'index différents ont des plages d'utilisation différentes. L'index HASH a des caractéristiques importantes qui nécessitent une attention particulière lors de son utilisation:

  • Utilisé uniquement pour les comparaisons d'égalité à l'aide des opérateurs = ou <=>;
  • L'optimiseur ne peut pas utiliser l'index HASH pour accélérer les opérations ORDER BY;
  • MySQL ne peut pas déterminer approximativement le nombre de lignes entre les deux valeurs. Si une table MyISAM est remplacée par une table MEMORY indexée HASH, cela affectera l'efficacité d'exécution de certaines requêtes;
  • Utilisez uniquement le mot-clé entier pour rechercher une ligne.

Pour les index BTREE, lorsque vous utilisez>, <,> =, <=, BETWEEN,! = Ou <>, ou l'opérateur LIKE'pattern ', vous pouvez utiliser l'index sur la colonne appropriée.

Les requêtes de plage suivantes s'appliquent à l'index BTREE et à l'index HASH:

SELECT * FROM t1 WHERE key_col = 1 OR key_col IN (15,18,20);

Les requêtes de plage suivantes ne s'appliquent qu'aux index BTREE:

SELECT * FROM t1 WHERE key_col > 1 AND key_col < 10;
SELECT * FROM t1 WHERE key_col LIKE 'ab%' OR key_col BETWEEN 'lisa' AND 'simon';

Par exemple, créez une table de moteur de stockage MEMORY city_memory identique à la table city:

mysql> CREATE TABLE city_memory( 
	 > city_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, 
	 > city VARCHAR(50) NOT NULL,
     > country_id SMALLINT UNSIGNED NOT NULL,
     > last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
     > PRIMARY KEY(city_id), KEY idx_fk_country_id (country_id) )ENGINE=Memory DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.00 sec)

Lorsque vous utilisez une table Memory, s'il s'agit d'un index HASH créé par défaut, vous devez faire attention à l'écriture des instructions SQL pour vous assurer que l'index supérieur peut être utilisé. Si vous devez utiliser une requête de plage, vous devez choisir de créer un index BTREE lors de la création d'un index.


4. Résumé

Les index sont utilisés pour trouver rapidement des lignes avec une valeur spécifique dans une colonne . Si vous n'utilisez pas d'index, MySQL doit commencer par le premier enregistrement, puis lire la table entière jusqu'à ce qu'il trouve les lignes pertinentes. Plus la table est grande, plus cela prend de temps. Si la colonne de requête de la table a un index, MySQL peut rapidement atteindre un emplacement pour rechercher le milieu du fichier de données, et il n'est pas nécessaire de regarder toutes les données.

La plupart des index MySQL (tels que PRIMARY KEY, UNIQUE, INDEX et FULLTEXT, etc.) sont stockés dans BTREE. Seul l'index spatial utilise BTREE et la table MEMORY prend également en charge l'index HASH.

Je suppose que tu aimes

Origine blog.csdn.net/qq_36879493/article/details/108541467
conseillé
Classement