2012-01-03 46 views
2

我有一個查詢我需要運行,目前運行速度非常慢。我正在使用的表格有近100萬條記錄。MYSQL查詢,優化LIKE,而不是在

我需要做什麼是對與LIKE名稱項搜索:例"SELECT name, other, stuff FROM my_table WHERE name LIKE '%some_name%'"

此外,它必須能夠排除某些方面與從搜索結果中通配符所以它變成是這樣的:

SELECT name, other, stuff 
FROM my_table 
WHERE name LIKE '%some_name%' 
AND name NOT IN (SELECT name FROM my_table WHERE name LIKE '%term1%' AND name LIKE '%term2%' AND name LIKE '%term3%') 

最重要的是,我有兩個INNER JOIN,我必須在PHP中執行它。我在表中列出了相關列的索引。它在服務器上的速度非常快,幾乎可以對其他任何查詢進行處理。

問題是,有沒有一種不同的方法可以用來做這種類型的查詢,這很快?

最新通報

這是添加在FULLTEXT索引的表化學,並試圖匹配功能,而不是經過我的實際查詢。注:我無法控制表/列名稱。我知道他們看起來不錯。

CREATE FULLTEXT INDEX name_index ON chems (name) 

SELECT f.name fname, f.state, f.city, f.id fid, 
cl.alt_facilid_ida, cl.alt_facili_idb, 
c.ave, c.name, c.id chem_id, 
cc.first_name, cc.last_name, cc.id cid, cc.phone_work 
FROM facilities f 
INNER JOIN facilitlt_chemicals_c cl ON (f.id = cl.alt_facilid485ilities_ida) 
INNER JOIN chems c ON (cl.alt_facili3998emicals_idb = c.id) 
LEFT OUTER JOIN facilities_contacts_c con ON (f.id = con.alt_facili_ida) 
LEFT OUTER JOIN contacts cc ON (con.alt_facili_idb = cc.id) 
WHERE match(c.name) against ('+lead -gas' IN BOOLEAN MODE) 

這只是一個簡單查詢的例子。實際條件可能很多。

+1

你對MY_TABLE主鍵或唯一的ID結合MySQL和獅身人面像查詢?如果所以它可能會更快地做'...和id不在(選擇id從...' – cmbuckley 2012-01-03 19:01:07

+1

而不是一個子選擇我會簡單地做: 其中名稱LIKE'%some_name%' AND name NOT LIKE'%term1%' AND name not LIKE'%term2%' AND name not LIKE'%term3%' 這樣會更快 – 2012-01-03 19:18:36

+0

另外,如果您使用子選擇,您應該分開您的條件OR,而不是AND,除非它們全部都需要 – 2012-01-03 19:19:41

回答

5

你想在你正在搜索的列上實現MySQL的全文功能。詳細瞭解它here

而且,你可能想要做的布爾搜索:

select 
    t1.name, 
    t1.stuff 
from 
    my_table t1 
where 
    match(t1.name) against ('+some_name -term1 -term2 -term3' in boolean mode) 
+1

我也可以建議'boolean mode' serching(http://dev.mysql.com/doc/refman/5.0/en/fulltext- boolean.html),它將添加符號,如+和 - 來要求或排除單詞。還有什麼是加入點/'不在'。這甚至可以通過匹配('+ some_name -term1 -term2')''match(t1.name)' – 2012-01-03 19:06:46

+0

@JonathanKuhn - 偉大的建議來刪除join /'not in'。我已經使用MySQL全文搜索已經有好幾年了,所以謝謝你填補空白:) – Eric 2012-01-03 19:07:38

+1

修復'('+ some_name -term1 -term2'BOOLEAN模式)''。 – 2012-01-03 19:09:31

1

我會建議使用像Lucene的或獅身人面像外部全文引擎。特別是如果您打算針對相對較大的數據集啓動搜索查詢。

在獅身人面像的情況下,你可以使用一個叫做SphinxQL SELECT語法類似的要求,這將做的正是:在http://sphinxsearch.com/docs/current.html#extended-syntax(你的情況不是運營商)所描述的

SELECT * FROM <sphinx_index_name> WHERE MATCH('some_name -term1 -term2 -term3'); 

。另外,您可以啓用形態支持,這可能也有幫助。

您可以http://sphinxsearch.com/docs/current.html#sphinxse