Utilisation des tables d'index sur select * order by c2,C1
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:
1 2 3
| select *
from table
order by c1,C2 |
il utilise la table d'index de la primary.
Si je fais un
Code:
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:
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:
1 2 3
| select *
from table
order by c2,c1 |
" ??
Voici l'exemple :
Code:
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:
1 2 3 4 5 6
| use mybase;
explain
select *
from mytable
order by number,name
limit 100000,2; |
-> utilise la PRIMARY
Code:
1 2 3 4 5
| explain
select *
from mytable
order by name,number
limit 100000,2; |
-> Using filesort
Code:
1 2 3 4 5
| explain
select name,number
from mytable
order by name,number
limit 100000,2; |
-> Utilise idx_name