2012-07-20 76 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