Question

Je dois accélérer une requête. Est-ce qu'une table d'index est ce que je cherche? Si oui, comment en faire un? Dois-je le mettre à jour à chaque insertion?

Voici les schémas de table:

--table1--   |   --tableA--   |    --table2--
id           |   id           |    id
attrib1      |   t1id         |    attrib1
attrib2      |   t2id         |    attrib2
             |   attrib1      |

Et la requête:

SELECT 
  table1.attrib1, 
  table1.attrib2,
  tableA.attrib1 
FROM 
  table1,
  tableA
WHERE 
  table1.id = tableA.t1id
  AND (tableA.t2id = x or ... or tableA.t2id = z)
GROUP BY 
  table1.id
Était-ce utile?

La solution

Vous devez créer un index composite sur tableA :

.
CREATE INDEX ix_tablea_t1id_t2id ON table_A (t1id, t2id)

Les index dans MySQL sont considérés comme faisant partie d'un tableau: ils sont automatiquement mis à jour et utilisés automatiquement chaque fois que l'optimiseur décide que c'est un bon choix de les utiliser.

MySQL n'utilise pas le terme table d'index .

Ce terme est utilisé par Oracle pour désigner ce que d'autres bases de données appellent CLUSTERED INDEX : une sorte de table dans laquelle les enregistrements eux-mêmes sont organisés en fonction de la valeur d'une colonne. (ou un ensemble de colonnes).

Dans MySQL :

  • Lorsque vous utilisez le stockage MyISAM , un index est créé en tant que fichier séparé portant l'extension .MYI .

    Le contenu de ce fichier représente un B-Tree , chaque feuille contenant la clé d'index et un pointeur vers le décalage dans le fichier .MYD contenant les données.

    La taille du pointeur est déterminée par le paramètre du serveur appelé myisam_data_pointer_size , qui peut varier de 2 à 7 octets et par défaut à 6 depuis MySQL 5.0.6 .

    Ceci permet de créer des tables MyISAM jusqu'à 2 ^ (8 * 6) octets = 256 To

  • Dans InnoDB , toutes les tables sont classées de manière inhérente par la PRIMARY KEY , elle ne prend pas en charge les tables organisées par tas.

    Chaque index, par conséquent, n’est en réalité qu’une simple table InnoDB consistant en un seul PRIMARY KEY de N + M enregistrements: < code> N enregistrements étant une valeur indexée et M enregistrements étant un PRIMARY KEY de l'enregistrement de la table principale contenant les données indexées.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top