web-dev-qa-db-fra.com

Comprendre plusieurs index de colonnes dans une requête MySQL

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?

56
John

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 colonnes ORDER BY Supplémentaires sont des constantes dans le WHERE clause. Les requêtes suivantes utilisent l'index pour résoudre la partie ORDER 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.


Index à deux colonnes

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

Index à colonne unique

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
56
Kermit