6

是否可以在 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未被识别。

4

2 回答 2

3

MySQL 不允许在视图上使用任何形式的索引,只是在它的基础表上。这样做的原因是因为 MySQL 仅在您从中选择视图时才具体化视图,因为基础表可能一直在更改数据。如果您有一个返回 1000 万行的视图,则每次从中选择时都必须对其应用全文索引,这需要很长时间。

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

于 2011-03-15T16:07:04.727 回答
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')

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

于 2020-10-21T17:01:29.990 回答