Utilisation des index composés avec un champ à valeur unique et EXPLAIN
Bonjour, j'aurais une question sur l'optimisation des index
j'ai une table avec 3 champs
le premier est la clef primaire
le deuxième n'a que des 1 dedans
le troisième à des valeurs diverses
sur cette table il y a un index unique composé sur le deuxième + troisième champs
sur cette table je fait des select where champ3 =
1) comme l'index composé n'a que des 1 dans sont premier champ peut il etre utilisé ?
2) l'ajout d'un index sur le troisième champs est il intéressant?
3) Que j'ajoute ou pas le second index, un
EXPLAIN ANALYZE de ma requête ne donne pas d'"Index Scan using" ni de "Index Cond", comment cela se fait il ?
Merci d'avance
index composés et valeurs uniques
Bonjour merci beaucoup de votre participation,
mon cas n'était pas tout à fait celui-là mais un peu tordu et difficile à s'imaginer de fait.
En fait dans le premier champs de l'index je n'ai qu'une valeur, toujours la même, d'où la confusion avec unique ;)
A la suite des derniers scripts, j'ai donc fait
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
|
DROP TABLE tt;
CREATE TABLE tt (id int, fk1 int, val1 char(100));
WITH tmp AS (SELECT generate_series(1, 1000000) AS val)
INSERT INTO tt SELECT val, 1, val FROM tmp;
analyze;
EXPLAIN analyze
SELECT *
FROM tt WHERE val1 = '100';
"Seq Scan on tt (cost=0.00..29742.00 rows=1 width=109) (actual time=0.144..340.945 rows=1 loops=1)"
" Filter: (val1 = '100'::bpchar)"
"Total runtime: 341.004 ms"
CREATE INDEX idx_tt ON tt (fk1, val1);
analyze;
EXPLAIN analyze
SELECT *
FROM tt WHERE val1 = '100';
"Seq Scan on tt (cost=0.00..29742.00 rows=1 width=109) (actual time=0.170..260.504 rows=1 loops=1)"
" Filter: (val1 = '100'::bpchar)"
"Total runtime: 260.575 ms"
DROP INDEX idx_tt;
CREATE INDEX idx_tt ON tt (val1);
analyze;
EXPLAIN analyze
SELECT *
FROM tt WHERE val1 = '100';
"Index Scan using idx_tt on tt (cost=0.00..8.92 rows=1 width=109) (actual time=0.460..0.463 rows=1 loops=1)"
" Index Cond: (val1 = '100'::bpchar)"
"Total runtime: 0.517 ms" |
Donc du coup, seul l'index non composé peut être utilisé pour mon cas.
Cela semble donc en contradiction avec http://use-the-index-luke.com/fr/sql...dex-concatenes
voir Figure 2.1. Index concaténé