2011-07-14 42 views
0

這裏是我的查詢:如何優化與多個全文MySQL查詢匹配

SELECT heading FROM table_a, table_b as m1, table_b as m2 WHERE (m1.join_id = '69' AND MATCH(m1.content) AGAINST('Harry' IN BOOLEAN MODE)) AND (m2.join_id = '71' AND MATCH(m2.content) AGAINST('+Highway +Design' IN BOOLEAN MODE)) AND m1.webid = table_a.id AND m2.webid = table_a.id 

現在大約需要3秒。如果我拿出這樣的條件之一:

SELECT heading FROM table_a, table_b as m2 WHERE (m2.join_id = '71' AND MATCH(m2.content) AGAINST('+Highway +Design' IN BOOLEAN MODE)) AND m2.webid = table_a.id 

大約需要0.05秒。

我在「內容」列上有一個全文索引。

此外,在第一個查詢中,如果我要搜索「Highway Design」(沒有像+或「」的操作符),則需要大約30秒。

這裏是我的解釋查詢:

d select_type  table type possible_keys key  key_len  ref  rows Extra 
    1 SIMPLE m1 fulltext id_index,content_ft  content_ft 0  1 Using where 
    1 SIMPLE table_a  eq_ref PRIMARY  PRIMARY  4 user.m1.id 1  
    1 SIMPLE m2 fulltext id_index,content_ft  content_ft 0  1 Using where 

還有什麼我可以做,以加快步伐?

解釋我的表, 表-A是具有標題主表和內容領域, 表-B是我在表-A行屬性表,使表-A行可以有額外的屬性。

讓我知道是否需要更好地解釋這一點。

謝謝!這裏

更新快速查詢的解釋:

id select_type  table type possible_keys key  key_len  ref  rows Extra 
    1 SIMPLE m2 fulltext id_index,content_ft  content_ft 0  1 Using where 
    1 SIMPLE table_a  eq_ref PRIMARY  PRIMARY  4 user.m2.webid 1  

另一個更新 - 表定義: 表-B

id int(11)    No None AUTO_INCREMENT 
join_id  int(11)    No None 
webid int(11)    No None 
content  text utf8_general_ci   No None 

指標的內容表-B

PRIMARY BTREE Yes No id 2723702 A  
    content BTREE No No content (333) 226975 A  
    id_index BTREE No No webid 151316 A  
    content_ft FULLTEXT No No content 118421 

TABLE_A

id int(11)    No None AUTO_INCREMENT 
    heading  text utf8_general_ci   Yes  NULL 

表中的索引

PRIMARY BTREE Yes No id 179154 A  
    heading BTREE No No heading (300) 89577 A YES 
+0

顯示第二個快速查詢的解釋 – Karolis

+0

剛剛做過,請告訴我是否需要任何其他信息。謝謝! – Gerry

+0

我認爲表格定義也是有用的。 – Karolis

回答

0

好吧,我的第一個觀點是改變的全文搜索一個LIKE條款。爲此目的,在(webid,join_id)上有webid或甚至更好的複合索引的索引是很好的。這應該有助於更加一致的表格連接。

+0

好吧,我會試試這個,我想問題是應該是哪一個,哪個應該是全文? – Gerry

+0

@Gerry最好測試一下,因爲我對數據瞭解不多。 – Karolis

+0

僅供參考 - 這將是我可以測試這個幾個小時之前,我會盡快標記你的答案是否正確:) – Gerry