2012-07-20 43 views
1

我在运行使用MyISAM数据库的SQL查询时遇到性能问题。针对多个表的SQL匹配查询的性能问题

要介绍这一点,我有3个表:
表:(发动机的MyISAM总记录数:1847)甲
表:(发动机的MyISAM总记录数:1110)乙
表:C(发动机的MyISAM。总记录数:57867)

现在我正在查询花费623秒得到执行,并且有时它发生,从服务器的连接(同样是本地主机被中止的情况下)。

下面是我执行查询:

SELECT MATCH(A.title, A.description) AGAINST('Computer Graphic Artist') AS 'Score', 
    A.code AS 'Code', 
    B.cluster AS 'Cluster', 
    B.pathway AS 'Pathway', 
    A.title AS 'Role', 
    A.description AS 'Description' 
FROM B 
INNER JOIN A ON B.code = A.code 
INNER JOIN C ON B.code = C.code 
WHERE MATCH(A.title, A.description) AGAINST('Computer Graphic Artist') 
    OR MATCH(B.cluster, B.pathway, B.descripton) AGAINST('Computer Graphic Artist') 
    OR MATCH(C.title) AGAINST('Computer Graphic Artist') 
ORDER BY Score DESC, B.cluster ASC 

您也可以参考Pastie(如果你觉得无法看到这个SQL)。我已经在适用的地方添加了FULLTEXT属性。

注:表A,B和C也有少量重复记录。

请让我知道,我如何优化这个SQLfor快速输出。

+1

可以附加一个解释? – 2012-07-20 12:56:37

+0

@Neville:你到底想要我在这里附上什么? – 2012-07-22 11:27:01

回答

0

要做的第一件事就是确保你确切的集合你从每个表查询的列有一个适当的FULLTEXT指数:

alter table A add fulltext index a_fti (title,description); 
alter table B add fulltext index b_fti (cluster, pathway, descripton); 
alter table C add fulltext index c_fti (title); 

然后我会建议重写查询中使用UNION而不是OR。使用这种方法,我已经从FULLTEXT搜索中获得了更好的性能,特别是在MySQL中。

下面是一个使用您的查询的例子:

select Score, Code, Cluster, Pathway, Role, Description 
from 
(
SELECT MATCH(A.title, A.description) AGAINST('Computer Graphic Artist') AS 'Score', 
    A.code AS 'Code', 
    B.cluster AS 'Cluster', 
    B.pathway AS 'Pathway', 
    A.title AS 'Role', 
    A.description AS 'Description' 
FROM B 
INNER JOIN A ON B.code = A.code 
INNER JOIN C ON B.code = C.code 
WHERE MATCH(A.title, A.description) AGAINST('Computer Graphic Artist') 
UNION 
SELECT MATCH(A.title, A.description) AGAINST('Computer Graphic Artist') AS 'Score', 
    A.code AS 'Code', 
    B.cluster AS 'Cluster', 
    B.pathway AS 'Pathway', 
    A.title AS 'Role', 
    A.description AS 'Description' 
FROM B 
INNER JOIN A ON B.code = A.code 
INNER JOIN C ON B.code = C.code 
WHERE MATCH(B.cluster, B.pathway, B.descripton) AGAINST('Computer Graphic Artist') 
UNION 
SELECT MATCH(A.title, A.description) AGAINST('Computer Graphic Artist') AS 'Score', 
    A.code AS 'Code', 
    B.cluster AS 'Cluster', 
    B.pathway AS 'Pathway', 
    A.title AS 'Role', 
    A.description AS 'Description' 
FROM B 
INNER JOIN A ON B.code = A.code 
INNER JOIN C ON B.code = C.code 
WHERE MATCH(C.title) AGAINST('Computer Graphic Artist') 
) as sub_query 
ORDER BY Score DESC, Cluster ASC 
+0

感谢@IkeWalker的回应..我遵循你的第一步。对于第二个建议我使用UNION的地方,我会试试这个(只有在这样的状态下,我才能告诉你,如果我在性能方面找到了更好的o/p)。但是想知道(在看到修改过的查询之后),它比原来的要大得多,UNION如何使它与OR条件不同(如果我们谈论这个特殊情况)。您的回应对我深入了解这一点非常有帮助。 – 2012-07-22 11:25:24

+0

Hi @Ike:我试着用上面提到的方法,现在我已经看到了性能的提高:-)现在查询需要54秒来获取结果。不过,我想知道,如果我们可以在这里优化它!另一件事:因为这是在开发环境中运行的,所以一旦在生产服务器或Live服务器上执行此查询,我可以期待更快的o/p。寻找你宝贵的回应。非常感谢您的帮助:-) – 2012-07-23 10:57:24