je crée avec MySQL une table simple avec trois champs dont deux champs c1 et C2 sont dans la PRIMARY.

Si je fais un
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
select * 
from table 
order by c1,C2
il utilise la table d'index de la primary.

Si je fais un
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
select * 
from table 
order by c2,c1
il n'utilise aucune table d'index ALORS que j'ai ajoute une table d'index unique C2,C1 en plus.

Remarque, si je fais un
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
select c2,c1 
from table 
order by c2,c1
il utilise la table d'index ajoutée.


Comment faire pour qu'il utilise la table d'index dans le cas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
select * 
from table 
order by c2,c1
" ??


Voici l'exemple :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
create database MYBASE;
 
DROP TABLE IF EXISTS `MYBASE`.`MYTABLE` ;
 
CREATE  TABLE IF NOT EXISTS `MYBASE`.`MYTABLE` (
  `NUMBER` INT(11) NOT NULL ,
  `NAME` VARCHAR(10) NOT NULL ,
  `STATE` INT(11) NOT NULL ,
  PRIMARY KEY (`NUMBER`, `NAME`) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1;
 
CREATE INDEX `idx_number` ON `MYBASE`.`MYTABLE` (`NUMBER` ASC) ;
CREATE INDEX `idx_name` ON `MYBASE`.`MYTABLE` (`NAME` ASC) ;
CREATE UNIQUE INDEX `idx_name_number` ON `MYBASE`.`MYTABLE` (`NAME` ASC, `NUMBER` ASC) ;
Pour la tester :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
use mybase;
explain 
select * 
from mytable 
order by number,name 
limit 100000,2;
-> utilise la PRIMARY

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
explain 
select * 
from mytable 
order by name,number 
limit 100000,2;
-> Using filesort

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
explain 
select name,number  
from mytable 
order by name,number 
limit 100000,2;
-> Utilise idx_name