要索引哪些列以使此查询更快?

时间:2010-11-03 22:27:47

标签: sql mysql database-indexes

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`

archdetails

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    |

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      |  

我在1的{​​{1}}和compname version archdetails上的4索引上有svn3索引; revno; revno, comp, compname;和comp, compname

compname上的索引长度为100。

查询仍需执行name, revno, comp, compname,这对我来说非常昂贵。我对索引没有多少经验,上面的索引是用最常用的变量创建的。请告知如何进行索引。

2 个答案:

答案 0 :(得分:0)

快速回答:包含where子句中的字段。

在您的情况下,请考虑索引svn3.revno和archdetails.version。然后查看联接中的列。索引archdetails.compname也是值得考虑的。

当然,您不希望添加太多索引。它们使插入和删除速度变慢,并使您的数据库占用更多空间。

答案 1 :(得分:0)

试试这个

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'