我有一個查詢我需要運行,目前運行速度非常慢。我正在使用的表格有近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)
這只是一個簡單查詢的例子。實際條件可能很多。
你對MY_TABLE主鍵或唯一的ID結合MySQL和獅身人面像查詢?如果所以它可能會更快地做'...和id不在(選擇id從...' – cmbuckley 2012-01-03 19:01:07
而不是一個子選擇我會簡單地做: 其中名稱LIKE'%some_name%' AND name NOT LIKE'%term1%' AND name not LIKE'%term2%' AND name not LIKE'%term3%' 這樣會更快 – 2012-01-03 19:18:36
另外,如果您使用子選擇,您應該分開您的條件OR,而不是AND,除非它們全部都需要 – 2012-01-03 19:19:41