0

好吧,首先,对不起我的英语。我尝试在用户可以包含一些文本的表中进行查询,例如博客页面。用户可以设计 html 格式的内容。在我的表中,它是这样存储的:

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'(我正在使用它)是一个长文本字段,表是innodb。我不能使用全文搜索,因为它只适用于 myisam 表。我将查询设为:

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

但是查询非常非常慢,需要很长时间。该表有 849 条记录,并不大。如果我在 phpmyadmin 中编写相同的查询也需要非常非常长的时间。但是这个领域有很大的记录,有的记录有video html,table,images,但也就是这样,像上面这样的text。

我可以做什么???怎样才能提高查询的性能???我感谢您的所有帮助。非常感谢。再说一次,对不起我的英语。

4

1 回答 1

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)
);

wheredocid引用您的数据表(我将其命名为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通过添加计数列来改进表格,该列将保留文档中给定单词的多次出现。然后,您可以按此列对结果进行排序,并使它们与搜索词更加相关。

于 2012-10-12T22:15:23.473 回答