[MySQL] Erreur dans le choix d'un index pour une requête SELECT
Bonjour à tous, j'ai un soucis avec ma BD, je vais essayer d'exposer le plus clairement possible mon problème, étant donné que je ne suis pas un expert :) .
Dans ma BD, j'ai une table,
Code:
1 2 3 4 5 6 7 8 9 10 11
|
CREATE TABLE T_MA_TABLE (
SPECT_ID INTEGER NOT NULL,
SPECT_MEASURE_DATE TIMESTAMP NOT NULL,
SPECT_ANSWER_TYPE TINYINT(1) NOT NULL,
S_CODE VARCHAR(15) NULL,
B_NAME VARCHAR(40) NULL,
X_NAME VARCHAR(40) NULL,
CHAIN_NAME VARCHAR(40) NULL
SITE_NAME VARCHAR(40)
) TYPE=INNODB; |
avec comme PK SPECT_ID en auto-increment.
J'ai plusieurs indexs sur cette table et notamment les 2 suivants :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
CREATE INDEX IND_SPECT_X_DATE ON T_MA_TABLE
(
S_CODE ,
X_NAME ,
SPECT_MEASURE_DATE
);
CREATE INDEX IND_SPECT_B_DATE ON T_MA_TABLE
(
S_CODE ,
B_NAME ,
SPECT_MEASURE_DATE
); |
Maintenant, j'exécute cette requête :
Code:
1 2 3 4 5 6 7 8 9
|
SELECT * FROM maBD.t_ma_table t
WHERE X_NAME = "TOTO"
AND SPECT_ANSWER_TYPE = "0"
AND S_CODE = "TATA"
AND SITE_NAME LIKE "%"
AND CHAIN_NAME LIKE "%"
AND SPECT_TYPE LIKE "%"
ORDER BY SPECT_MEASURE_DATE; |
Cette requête me retourne plus ou moins 1500 lignes en qqs secondes.
Maintenant si j'exécute cette requête :
Code:
1 2 3 4 5 6 7 8 9
|
SELECT * FROM maBD.t_ma_table t
WHERE X_NAME = "TITI"
AND SPECT_ANSWER_TYPE = "0"
AND S_CODE = "TUTU"
AND SITE_NAME LIKE "%"
AND CHAIN_NAME LIKE "%"
AND SPECT_TYPE LIKE "%"
ORDER BY SPECT_MEASURE_DATE; |
Cette requête me retourne plus ou moins 1500 lignes, MAIS en 10 minutes...
Alors ne comprenant pas, j'ai exécuté ces 2 requêtes avec "EXPLAIN" devant pour voir ce qu'il se passait .
-> Pour la 1ère requête, MySQL utilise le bon index (le 1er) puisque je renseigne le champ X_NAME.
-> Pour la 2nde requête MySQL n'utilise pas le bon index (le 2nd)... Alors que seuls les 2 paramètres X_NAME et S_CODE changent...
Sachant que ces requêtes sont générées par mon programme java, et que donc je ne peux faire un truc du style USE_INDEX mon_bon_index, que me conseilleriez-vous de faire pour rétablir la situation??
D'avance merci pour vos tuyaux :)