如何优化以下查询?

时间:2013-04-08 16:34:13

标签: sql

我有两个表:maskedindextable和dictionarytable。

字典表有四列:

ID (primary key)
filelocation
dictionaryEncryptedIndex
dictionaryEncryptedWord

和值看起来像这样:

ID | filelocation | dictionaryencryptedindex | dictionaryEncryptedWord
0 | c:/test.txt | 0x01 | EAD64zef6z
1 | c:/test.txt | 0x02 | 5ez4f
2 | c:/test.txt | 0x03 | ze654f
3 | c:/john.txt | 0x01 | 6ze5f4
4 | c:/john.txt | 0x02 | ze5f68z4f
5 | c:/john.txt | 0x03 | EAD64zef6z 
6 | c:/smith.txt | 0x01  | er6g4
7 | c:/smith.txt | 0x02 | z6e58g4
8 | c:/smith.txt | 0x03  | a64zef6z
9 | c:/laura.txt | 0x01  | EAD64zef6z

此表有700 000个值

maskedindextable有四列:

ID (primary key)
filelocation
maskedIndexEncryptedIndex
maskedIndexEncryptedValue

值看起来像这样:

ID | filelocation | maskedIndexEncryptedIndex | maskedIndexEncryptedValue
0 | c:/test.txt | 0x01 | 5z1ef
1 | c:/test.txt | 0x02 | e6rh546er4g
2 | c:/test.txt | 0x03 | z6ef548ezf
3 | c:/john.txt | 0x01 | (y48try68
4 | c:/john.txt | 0x02 | iu47k
5 | c:/john.txt | 0x03 | 6tkj
6 | c:/smith.txt | 0x01  | 6ez5r48
7 | c:/smith.txt | 0x02 | 6i5
8 | c:/smith.txt | 0x03  | 6e5rg
9 | c:/laura.txt | 0x01  | ze654f

此表还有700 000个值

字典加密索引&表categorytable中的文件位置组合对应于maskedIndexEncryptedIndex&表maskedindextable中的文件位置。 我想找到相应的maskedindexencryptedvalue,加密的单词是EAD64zef6z。目前我正在使用以下查询:

SELECT DISTINCT MaskedIndexTable.filelocation, 
       dictionaryencryptedindex,
       maskedindexencryptedvalue
FROM MaskedIndexTable 
INNER JOIN DictionaryTable 
        ON MaskedIndexTable.maskedIndexEncryptedIndex = 
           DictionaryTable.dictionaryEncryptedIndex  
WHERE MaskedIndexTable.Id IN  
(SELECT DictionaryTable.Id 
 FROM  DictionaryTable 
 WHERE  `dictionaryEncryptedWord` LIKE 'EAD64zef6z') 
 AND  `dictionaryEncryptedWord` LIKE 'EAD64zef6z';

但是这个查询运行速度非常慢(需要3秒)。有谁知道如何优化我的查询?

4 个答案:

答案 0 :(得分:2)

简单陈述怎么样

SELECT dt.filelocation, dictionaryencryptedindex, maskedindexencryptedvalue
FROM MaskedIndexTable mit
INNER JOIN DictionaryTable  dt
  ON mit.maskedIndexEncryptedIndex = dt.dictionaryEncryptedIndex
  AND mit.filelocation = dt.filelocation 
WHERE dt.dictionaryEncryptedWord = 'EAD64zef6z';

如果您不使用通配符,则不需要LIKE。您还可以在ON声明的JOIN条款中添加多个条件。

您需要WHERE和JOIN列的索引,即DictionaryTable.dictionaryEncryptedWordDictionaryTable.filelocationDictionaryTable.dictionaryEncryptedIndexMaskedIndexTable.filelocationMaskedIndexTable.maskedIndexEncryptedIndex

答案 1 :(得分:1)

根据我的经验,每当查询速度很慢时,事实证明WHERE子句中提到的列没有索引。

尝试索引WHERE子句中出现的所有列。

答案 2 :(得分:1)

乍一看,WHERE子句中的子选择似乎没有用处。您还使用LIKE而不是简单的=。试试这个:

SELECT DISTINCT MIT.filelocation, 
   dictionaryencryptedindex,
   maskedindexencryptedvalue
FROM MaskedIndexTable MIT
    INNER JOIN DictionaryTable DT
    ON MIT.maskedIndexEncryptedIndex = 
       DT.dictionaryEncryptedIndex  
WHERE dictionaryEncryptedWord = 'EAD64zef6z';

答案 3 :(得分:0)

尝试删除where子句

中的select
SELECT DISTINCT MaskedIndexTable.filelocation, dictionaryencryptedindex
,     maskedindexencryptedvalue

FROM MaskedIndexTable INNER JOIN DictionaryTable ON MaskedIndexTable.maskedIndexEncryptedIndex = DictionaryTable.dictionaryEncryptedIndex  
WHERE `dictionaryEncryptedWord` LIKE 'EAD64zef6z';