在VIEW上创建全文索引

时间:2011-03-15 03:12:02

标签: mysql view full-text-search multiple-tables

是否可以在VIEW上创建全文索引?

如果是这样,在VIEW上给出了两列column1column2,那么完成这项工作的SQL是什么?

我想要这样做的原因是我有两个非常大的表,我需要对每个表上的单个列进行FULLTEXT搜索并合并结果。结果需要作为一个单元进行排序。

建议?

编辑:这是我尝试创建UNION并按每个语句得分排序。

(SELECT a_name AS name, MATCH(a_name) AGAINST('$keyword') as ascore 
     FROM a WHERE MATCH a_name AGAINST('$keyword'))
UNION  
(SELECT s_name AS name,MATCH(s_name) AGAINST('$keyword') as sscore 
     FROM s WHERE MATCH s_name AGAINST('$keyword'))
ORDER BY (ascore + sscore) ASC

sscore未得到承认。

2 个答案:

答案 0 :(得分:2)

MySQL不允许在视图上使用任何形式的索引,只是在它的基础表上。这样做的原因是,由于基础表可能一直在更改数据,因此MySQL仅在您选择视图时实现视图。如果你有一个返回1000万行的视图,你必须每次从中选择一个全文索引,这需要花费很多时间。

如果你想要完整的索引功能,那么你可以坚持使用你发布的SQL脚本,并手动(或cronjob脚本)每晚更新两个表的全文索引(或者如果你每小时更新一次)在那个高流量的市场中。)

答案 1 :(得分:1)

一种可能效率低下但可以完成工作的丑陋解决方法是将视图与基础表连接以访问全文列:

/* join the view with the underlying table, that is used in the view: */
select item.* from items_view as item
left join items as raw_item on raw_item.id = item.id
/* use the `item` from the view as usual: */
where item.foo = 'bar'
/* but use `raw_item` when you need the fulltext index: */
where match (raw_item.content) against ('foo bar')

当然,如果您需要在视图中创建一个新列并为其提供全文索引,那么这不是一个相关的解决方案,但是如果您只需要以这种方式访问​​原始数据并且只需要该视图对于其他不相关的操作,则可能是这样。