2012-10-12 48 views
0

好吧,所有的都是,我的英語很抱歉。我嘗試在表格中進行查詢,用戶可以包含一些文本,如博客頁面。用戶可以用html格式設計內容。在我的表格中它是這樣存儲的:查詢非常慢的longtext字段innodb表

Estadísticas<br /> 
<table border="0"> 
<tbody> 
<tr> 
<td>Columna 1</td> 
<td>Columna 2</td> 
</tr> 
<tr> 
<td>Columna 3<br /></td> 
<td>Columna 4<br /></td> 
</tr> 
</tbody> 
</table> 

我必須在那個內容中存儲所有用戶的需要。 'texto'字段(我用它)是一個longtext字段,表是innodb。我不能使用全文搜索,因爲它只適用於myisam表格。我提出的查詢爲:

"SELECT * FROM texto WHERE texto like '%$variable%'" 

但查詢是非常非常慢,它需要一個永恆。該表有849條記錄,這不是很大。如果我在phpmyadmin中編寫相同的查詢也需要很長很長的時間。但是這個領域有很大的記錄,有些記錄有視頻html,表格,圖片,但是就像上面那樣。

我能做什麼?如何提高查詢的性能?我感謝你的幫助。非常感謝。再次,我的英語很抱歉。

回答

1

不幸的是,您無法從您擁有的結構中獲得更多 - 任何聚集索引或非聚集索引都無法處理like '%...'查詢。最好的解決方案可能是將您的數據導出到某些全文搜索引擎(例如SOLR)並使用此引擎來完成用戶查詢。如果這是不可能比另一種解決方案是創建一個tokens表,將發揮文本索引的作用:

create table tokens(
    token varchar(100) not null, 
    docid int not null references testdo(id), 
    constraint PK_tokens primary key (token, docid) 
); 

其中docid引用您的數據表(我把它命名爲testdo)。

然後你需要通過一些普通的HTML表達式拆分用戶博客文章填補tokens表,例如:

insert ignore into tokens values 
('Estad', 1), 
('Columna 1', 1), 
('Columna 2', 1), 
('Estad', 1); 

通知ignore關鍵字將自動忽略可能出現的任何重複。隨着tokens桌上擺滿了數據你可能會修改您的查詢是這樣的:

select * from testdo d 
    inner join tokens t on t.docid = d.id where t.token like 'Col%' 

,因爲它的使用索引和鍵查找應該執行速度更快。

PS。您可以通過添加一個計數列來改進tokens表,該列將保留文檔中給定單詞的出現次數。然後,您可以通過此列對結果進行排序,並使它們與搜索字詞更相關。

+0

謝謝你,謝謝你的幫助。這對我有很大的幫助。非常感謝你。 –