2013-09-26 92 views
0

這個MySQL查詢拼命地跑在大(約20萬條記錄,41列)MyISAM表:最佳方式使用索引大型的MySQL查詢功能

選擇T1 *從table T1其中1和T1。 inactive ='0'and(t1。code like'%searchtext%'或t1。name like'%searchtext%'或t1。ext like'%searchtext%')order by t1。 id desc LIMIT 0,15

id是主索引。

我試着在所有3個搜索(像)列上添加一個多列索引。工作正常,但結果是在網站上的自動填充阿賈克斯表和2 seond返回延遲是有點太慢。

我也嘗試在所有3列上添加獨立索引,並在所有3列上添加全文索引而沒有顯着改進。

什麼是最佳的方式來優化這種類型的查詢?我想在1秒的時間內完成表演,是否可行?

回答

0

你可以做的最好的事情是實現分頁。不管你做什麼,這個IO成本將會是巨大的。如果您只返回一頁記錄,10/25 /或任何對我有用的信息。

至於索引,你需要檢查計劃,看看你的索引是否被實際使用。全文索引可能會有所幫助,但這取決於您返回的行數和傳入的內容。使用諸如%之類的參數確實會影響性能。如果以%結尾但不以%開頭,則仍然可以使用索引。如果你在你正在搜索的文本的兩邊都放上%,索引不會有太大的幫助。

0

您可以創建一個涵蓋三列的全文索引:code,nameext。如果省略ORDER BY子句中的列通過使用MATCH功能結果相關性值默認排序

select t1.* 
from table t1 
where match(code, name, ext) against ('searchtext') 
order by t1.id desc 
limit 0, 15 

:使用MATCH() AGAINST()函數然後執行全文查詢。欲瞭解更多信息,請閱讀Full-Text Search Functions documentation

正如@Vulcronos所指出的,當LIKE運算符與以通配符%開頭的表達式一起使用時,查詢優化程序無法使用索引。

相關問題