J'ai une capture d'écran de table avec 3 champs:Index sur le champ de date mysql
CREATE TABLE `screenshot` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`UserID` int(11) NOT NULL,
`DateTaken` date NOT NULL,
PRIMARY KEY (`ID`),
KEY `DateTaken` (`DateTaken`),
KEY `UserID` (`UserID`) USING BTREE,
CONSTRAINT `userID_foreign_key` FOREIGN KEY (`UserID`) REFERENCES `users` (`UserID`)
) ENGINE=InnoDB AUTO_INCREMENT=22514871 DEFAULT CHARSET=latin1
Et
SELECT @@innodb_buffer_pool_size
Résultat: 16777216
Requête:
SELECT COUNT(ID) total
FROM screenshot WHERE DateTaken BETWEEN '2000-05-01' AND '2000-06-10'
Résultat: 2828844
EXPLAIN:
ID|select_type| table |type |possible_keys| key |key_len| rows |Extra
1 | SIMPLE |screenshot|range| DateTaken |DateTaken| 3 |5730138|Using where; Using index
Voici mon problème: je index ajouté à la colonne DateTaken et encore les lignes de balayage (Expliquer la sortie) est plus grand que le résultat. Il semble que cela fasse toute une table de balayage. Et l'exécution de requête pour la requête prend 15 secondes. Comment puis-je améliorer la vitesse dans la requête ci-dessus?
merci pour l'aide. La vitesse s'est améliorée mais le résultat de la ligne d'analyse est toujours le même. Connaissez-vous la raison pour laquelle? :) –
Les index InnoDB incluent toujours la clé primaire. Remarquez que la sortie EXPLAIN de l'OP affiche "Using index" qui montre que même avec l'index à colonne unique sur DateTaken. Si elle était légèrement plus rapide après avoir suivi votre suggestion, je suggère que cela était dû au fait que l'index était complètement chargé dans le pool de mémoire tampon. –