2012-06-27 73 views
4

比方說,我有一個「物品」表,該表具有列:mysql - 任何方式來幫助全文搜索與另一個索引?

article_text: fulltext indexed 
author_id:  indexed 

現在我想搜索出現一個特定arthor寫的一篇文章中的一個術語。

所以像:

select * from articles 
where author_id=54 
and match (article_text) against ('foo'); 

的解釋此查詢告訴我,MySQL是隻打算使用全文索引。 我相信mysql只能使用1個索引,但它確實似乎是一個明智的想法,讓特定作者在全文搜索該術語之前先寫入所有文章......那麼無論如何要幫助mysql?

例如..如果你做了自我加入?

select articles.* from articles as acopy 
        join articles on acopy.author_id = articles.author_id 
where 
    articles.author_id = 54 
and match(article_text) against ('foo'); 

該解釋列出了先使用author_id索引,然後是全文搜索。

這是否意味着它實際上只對有限集合進行全文搜索,按author_id過濾?

附錄

的自我解釋計劃加入如下:

*************************** 1. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: acopy 
     type: ref 
possible_keys: index_articles_on_author_id 
      key: index_articles_on_author_id 
     key_len: 5 
      ref: const 
     rows: 20 
    filtered: 100.00 
     Extra: Using where; Using index 
*************************** 2. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: articles 
     type: fulltext 
possible_keys: index_articles_on_author_id,fulltext_articles 
      key: fulltext_articles 
     key_len: 0 
      ref: 
     rows: 1 
    filtered: 100.00 
     Extra: Using where 
2 rows in set (0.00 sec) 
+0

檢查author_id列是否可以爲空 – Sebas

+0

它不可爲空(我認爲這種情況更好,但如果不是,我當然可以使它爲空) – ggez44

+0

不,不能爲空總是更好 – Sebas

回答

0

好了,所以,因爲

索引合併並不適用於全文索引

http://dev.mysql.com/doc/refman/5.0/en/index-merge-optimization.html

我會嘗試這個辦法:(用你的食指上AUTHOR_ID的名稱替換author_id_index

select * from articles use index (author_id_index) 
where author_id=54 
and match (article_text) against ('foo'); 

這裏的問題是:

  • 這的確是不可能使用常規索引與全文索引結合使用
  • 如果您將自己與表連接在一起,那麼您正在使用聯接兩側的索引(ON子句將使用author_id列,在這裏肯定需要索引)

最有效的是由你決定的,在一些測試用例中,是否使用作者索引比文本索引更好。

+0

謝謝@Sebas。因此索引合併只會以您提出建議的方式或我編寫查詢的最初方式來進行。然而,在自加入的情況下,理論上author_id索引僅用於連接2個表中的匹配行。那麼希望全文能夠處理所產生的過濾集? – ggez44

+0

根據所說的mysql文檔,它將只使用每個表引用的一個索引。 where子句被認爲屬於一個表引用,所以我們不能真正談論一個'產生的過濾集合'。 where子句在我們得到一個實際的「產生的過濾集合」之前被評估......我很想看看解釋計劃。 – Sebas

+0

增加了解釋計劃..也是耶我在談論在數據庫級別產生的過濾集合..只是取決於命令mysql試圖做查找..計劃,它試圖解釋,如果你會=) – ggez44