2010-11-03 15 views
0
SELECT t.compname, min(t2.version) FROM archdetails t 
INNER JOIN svn3 b ON t.compname = b.compname 
INNER JOIN archdetails t2 ON t.compname = t2.compname 
WHERE ((b.revno = '270294' OR b.revno = 'r275869' OR b.revno = 'r393316')) 
    AND t.version = '1.6' 
GROUP BY t.compname` 

Tableau archdetails:Sur quelles colonnes indexer pour rendre cette requête plus rapide?

Field     | Type   | Null | Key | Default | Extra 
-------------------------+--------------+------+-----+---------+------- 
name      | varchar(15) | NO |  | NULL | 
compname     | varchar(500) | NO | MUL | NULL | 
sno      | int(11)  | NO |  | NULL | 
count     | int(11)  | NO |  | NULL | 
fdindex     | int(11)  | NO |  | NULL | 
version     | varchar(10) | NO |  | NULL | 
sdate     | date   | NO |  | NULL | 
edate     | date   | NO |  | NULL | 
inFlat     | int(11)  | NO |  | NULL | 
inStar     | int(11)  | NO |  | NULL | 
inNostar     | int(11)  | NO |  | NULL | 
inReducedStar   | int(11)  | NO |  | NULL | 

Tableau svn3:

Field | Type   | Null | Key | Default | Extra 
---------+---------------+------+-----+---------+------ 
name  | varchar(20) | NO | MUL | NULL | 
revno | varchar(10) | NO | MUL | NULL | 
comp  | varchar(1000) | NO | MUL | NULL | 
compname | varchar(1000) | NO |  | NA  | 

je index 1 sur compname version dans archdetails et 4 index sur svn3 sur revno; revno, comp, compname; comp, compname; et name, revno, comp, compname.

Les indices sur compname est de longueur 100.

La requête prend toujours 0.16 sec pour exécuter ce qui est très cher pour mon but. Je n'ai pas beaucoup d'expérience avec les index et les index ci-dessus ont été créés avec les variables les plus souvent utilisées. S'il vous plaît conseiller sur la façon d'aller sur les index.

+0

modifier Nice. Comment tu fais ça?. J'apprends encore à formater ici. – Gaurav

+0

Quatre espaces au début d'une ligne feront un bloc de code, ou vous pouvez cliquer sur le bouton "010" dans la barre d'outils d'édition. Pour info, la case de point d'interrogation orange vif est un lien vers la feuille de contrôle de formatage: http://stackoverflow.com/editing-help Stack Overflow fait la mise en évidence de la syntaxe, mais j'ai nettoyé votre SQL à la main. –

+0

Mon expérience avec mySql n'est pas bonne. Avez-vous considéré la version MS Sql Server Express? C'est gratuit, et permet DB jusqu'à 4 gig. Je suis passé à SQL Server et je l'ai trouvé beaucoup plus rapide. –

Répondre

0

Une réponse rapide: Incluez les champs qui se trouvent dans votre clause where.

Dans votre cas, pensez à indexer svn3.revno et archdetails.version. Ensuite, regardez les colonnes de votre jointure. Index archdetails.compname est un à considérer, aussi.

Bien sûr, vous ne voulez pas ajouter trop d'index. Ils rendent vos insertions et suppressions plus lentes, et rendent votre DB plus encombrant.

+0

Ouais c'est la bonne partie. Espace aucune contrainte. Les insertions et suppressions sont très rares – Gaurav

+0

Un bref article sur les index: http://rip747.wordpress.com/2007/12/03/optmizing-your-database-with-indexes/ –

+0

Au cas où vous auriez manqué mon commentaire sous votre question, envisager de passer à la version Express gratuite de MS SQL Server. Vous obtiendrez probablement de meilleures performances de requête que MySql. –

0

Essayez cette

SELECT DISTINCT 
t.compname, 
t.version 
FROM archdetails t 
INNER JOIN svn3 b 
     ON t.compname 
     = b.compname 
WHERE b.revno in ('270294','r275869','r393316') 
AND t.version = '1.6'