2010-12-01 5 views
0

Je veux alternative/efficace/optimisé requête pour requête suivante:mysql - Alternative/efficace/optimisé requête

Tableau:

CREATE TABLE `bartco_web_vms_studio`.`table_name` (
     `index` INT(10) NOT NULL AUTO_INCREMENT , 
     `id1` INT(10) NOT NULL DEFAULT '0', 
     `id2` VARCHAR(10) NOT NULL, 
     `f3` TINYINT(4) NOT NULL DEFAULT '0', 
     PRIMARY KEY (`index`) 
) ENGINE = MYISAM ; 

Indice Composite:

CREATE INDEX id1_id2 ON tablename (id1, id2); 

Nombre de lignes = 7891

Mettre à jour la requête:

UPDATE table_name 
SET f3=1 
WHERE id1=1 AND id2='a' 
    OR id1=2 AND id2='b' 
    OR id1=3 AND id2='c' 

Fondamentalement, je dois mettre à jour la valeur d'un champ en fonction de 2 champs (id1, id2) valeurs. Ces 2 champs peuvent être dans plus d'une paire.

sortie de EXPLAIN SELECT f3 FROM table_name WHERE ...:

id -> 1, 
select type -> SIMPLE, 
table -> table_name, 
type -> range, 
possible_keys -> id1_id2, 
key -> id1_id2, 
key_len -> 261, 
ref -> NULL, 
rows -> 2, 
Extra -> Using where 

Merci beaucoup pour l'aide

Cordialement

+1

Avez-vous un index pour ID1, ID2? – InSane

+0

@InSane - bonne question, +1. Juste pour développer cela, l'index idéal inclut id1 et id2 dans un index. Je voulais juste dire que c'est une question débutant. –

+1

Vous êtes conscient que la requête fournie ne va pas associer les valeurs id1 et id2 comme vous l'avez déclaré, n'est-ce pas? Vous devez utiliser des parenthèses pour qu'il soit évalué correctement. –

Répondre

2

Composite Index id1 + id2 et requête

WHERE (id1, id2) IN ((1, 'a'), (2, 'b'), (3, 'c')) 

devrait aider

En outre, lorsque vous testez, ajoutez d'autres lignes dans la table.

Puisque vous sélectionnez 3 lignes de 9 - mysql peut décider de ne jamais utiliser d'index du tout.

UPD:

si rien de nos réponses vous aidera - vous pouvez toujours partager votre requête à 3:

SELECT * FROM table WHERE id1 .. AND id2 .. 
UNION 
SELECT * FROM table WHERE id1 .. AND id2 .. 
... 
+0

Merci d'avoir répondu. Cette requête est-elle optimisée? Je veux dire que je peux avoir d'énormes données dans la table, donc ce travail sera-t-il plus rapide ou celui que j'ai dit ??? – user427969

+0

@ user427969: oui, ça devrait être mieux. Remplissez simplement votre tableau avec des données aléatoires et vérifiez-le. – zerkms

+0

Il s'agit certainement d'une meilleure reformulation de la requête d'origine - je m'attendrais à ce que le moteur MySQL s'adapte bien à chaque version. –