J'ai un tableau simple
stock_ledger_id INT(10) (Primary)
piece_to_bin_id INT(10)
quantity INT(11)
create_datetime TIMESTAMP
... and a few VARCHARs
avec quelques index simples
Key_name Cardinality
PRIMARY 1510443
piece_to_bin_id 100696
Cette requête plutôt simple prend environ 8 secondes :
SELECT piece_to_bin_id,
SUM(quantity),
MAX(create_datetime)
FROM stock_ledger
GROUP BY piece_to_bin_id
Voici l'EXPLIQUE :
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE stock_ledger ALL NULL NULL NULL NULL 1512976 Using temporary; Using filesort
J'ai trouvé que Je peux le réduire à environ 0,5 seconde. en forçant un index :
SELECT piece_to_bin_id,
SUM(quantity),
MAX(create_datetime)
FROM stock_ledger
FORCE INDEX (piece_to_bin_id)
GROUP BY piece_to_bin_id
Alors l'EXPLAIN ressemble à ceci :
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE stock_ledger index NULL piece_to_bin_id 4 NULL 1512976
J'utilise MySQL 5.1.41, la table est MyISAM et j'ai exécuté ANALYZE TABLE auparavant.
Je suis donc coincé avec "MySQL s'est encore trompé, forcez l'index" ou y a-t-il une raison réelle pour laquelle MySQL utilise un balayage complet de la table ? Peut-être une raison que je peux corriger ?