Voici la requête:
SELECT * FROM table WHERE accountid = 1 ORDER BY logindate DESC LIMIT 1
Maintenant, si j'ai ajouté un index avec plusieurs colonnes sur les champs:
INDEX(accountid,logindate)
MySQL profiterait-il de cet index à plusieurs colonnes? Ou ne l'utiliserait-il pas parce qu'un champ se trouve dans la clause where et l'autre dans une instruction order? Ou cela n'a-t-il pas d'importance tant que j'utilise les champs dans l'ordre de l'index à plusieurs colonnes?
Bonne question.
Les index fonctionnent de gauche à droite, donc vos critères WHERE
utiliseraient l'index. Le tri utiliserait également l'index dans ce cas (plan d'exécution ci-dessous).
Depuis le manuel :
L'index peut également être utilisé même si
ORDER BY
Ne correspond pas exactement à l'index, tant que toutes les parties inutilisées de l'index et toutes les colonnesORDER BY
Supplémentaires sont des constantes dans leWHERE
clause. Les requêtes suivantes utilisent l'index pour résoudre la partieORDER BY
:SELECT * FROM t1 WHERE key_part1=constant ORDER BY key_part2;
Si vous aviez un index de colonne unique (accountid
), un tri de fichiers serait utilisé à la place. Par conséquent, votre requête bénéficie de cet index.
create table t1 (
accountid tinyint,
logindate date);
create index idx on t1 (accountid, logindate);
insert into t1 values (1, '2012-09-05'), (2, '2012-09-09'), (3, '2012-09-04'),
(1, '2012-09-01'), (1, '2012-09-26'), (2, '2012-05-16'),
(1, '2012-09-01'), (3, '2012-10-19'), (1, '2012-03-01')
Plan d'exécution
ID SELECT_TYPE TYPE DE TABLE POSSIBLE_KEYS KEY KEY_LEN REF ROWS FILTERED EXTRA 1 SIMPLE t1 ref idx idx 2 const 5 100 Utilisation de where; Utilisation de l'index
create table t1 (
accountid tinyint,
logindate date);
create index idx on t1 (accountid);
insert into t1 values (1, '2012-09-05'), (2, '2012-09-09'), (3, '2012-09-04'),
(1, '2012-09-01'), (1, '2012-09-26'), (2, '2012-05-16'), (1, '2012-09-01'),
(3, '2012-10-19'), (1, '2012-03-01')
Plan d'exécution
ID SELECT_TYPE TYPE DE TABLE POSSIBLE_KEYS KEY KEY_LEN REF ROWS FILTERED EXTRA 1 SIMPLE t1 range idx idx 2 5 100 Utilisation de where; Utiliser le tri de fichiers