Pourquoi multi-colonnes MySQL est surpeuplée?
-
13-10-2019 - |
Question
Considérez le tableau suivant MySQL:
CREATE TABLE `log`
(
`what` enum('add', 'edit', 'remove') CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
`with` int(10) unsigned NOT NULL,
KEY `with_what` (`with`,`what`)
) ENGINE=InnoDB;
INSERT INTO `log` (`what`, `with`) VALUES
('add', 1),
('edit', 1),
('add', 2),
('remove', 2);
Si je comprends bien, l'indice de with_what
doit avoir 2 entrées uniques sur son premier niveau de with
et 3 (EDIT: 4) entrées uniques dans what
« subindex ». Mais les rapports MySQL 4 entrées uniques pour chaque niveau. En d'autres termes, le nombre d'éléments uniques pour chaque niveau est toujours égal au nombre de lignes dans le tableau de log
.
EDIT:. Il est correct pour le « second niveau » d'avoir le nombre d'entrées uniques égal au nombre total d'enregistrements, mais pas d'accord pour le niveau haut
EDIT2: Ont remarqué si le nombre de a bits occupé par la colonne de with
changé, par exemple pour int (11) et retour à int (10), CARDINALITY puis commencer à travailler comme prévu. Même affichage EXPLAIN SELECT COUNT(DISTINCT 'with') FROM log
valeur adéquate pour rows
.
Est-ce un bug, une fonction ou mon incompréhension?
La solution
SHOW INDEXES
affiche les statistiques qui sont approximatives.
Ces statistiques sont recueillies automatiquement les requêtes à la table sont effectuées, et en plus, vous pouvez forcer les rassembler manuellement en émettant ANALYZE TABLE log
.
La valeur de la colonne est cardinalité exacte et ne peut changer entre les appels à ANALYZE
, même si la table sous-jacente ne change pas.
Autres conseils
Votre compréhension est erronée. clé de plusieurs colonnes est créée à partir de plusieurs valeurs, et non pour plusieurs colonnes. rapports MySQL 4 entrées uniques parce que vous avez entré 4 paires uniques d'entrées.
Vous avez décrit des index séparés pour ces colonnes, donc au lieu
KEY `with_what` (`with`,`what`)
il devrait être
KEY `with` (`with`),
KEY `what` (`what`)
Et il devrait fonctionner comme vous le voulais.
vous devriez penser à une « colonne multi » index comme un « indice concaténé », ce qui signifie les colonnes individuelles sont concaténés dans l'index. Autrement dit, il y a une entrée d'index pour chaque ligne, et que l'entrée contient toutes les colonnes indexées.
Jetez un oeil à mon livre électronique pour obtenir l'image complète comment fonctionnent les index: http: // utilisation- The-Index-Luke.com/